GCCの次期バージョン GCC 4.3 がそろそろリリースされそうです.そこで実際に開発版のGCC 4.3を試し,変更点・残っているバグなどを調べてみました.
変更点・改良点は http://gcc.gnu.org/gcc-4.3/changes.html にまとめられています.以下,GCC 4.3のsnapshot版(gcc-4.3-20071130)を試用し,実際に影響を受けた変更点・バグをまとめます.
C/C++での変更点
"extern inline"は書き換える必要があります
extern inline のままでもコンパイルは出来ますが,リンク時に「シンボル名が重複した」というエラーが出ます.
対処方法としては二つ方法があります.一つ目は以下のように
extern inline #ifdef __GNU_STDC_INLINE__ __attribute__((__gnu_inline__)) #endif
と __attribute__ 属性を追加する方法です.二つ目は "extern inline" を "static inline"に書き換える方法です.gcc-4.2以前の古いGCCを使った場合でもコンパイルできるという意味では二つ目の方法に利があるように思えます.
string.h や stdlib.h を明示的にインクルードする必要があります
c++で記述したソースコードをg++-4.3でコンパイルすると,以下のようなエラーが良くでます.
main.cpp:11: error: 'strcpy' was not declared in this scope
これは strcpy のプロトタイプ宣言があるヘッダファイル string.h を include していない事が原因です.
gcc-4.2以前では string.h や stdlib.h のようなヘッダファイルをincludeしなくても strcpy や exit のような関数を使うことが出来ましたが, gcc-4.3 以降は 明示的に 必要なヘッダファイルをincludeする必要があるとのことです.
namespaceの扱いが厳しくなりました.
boostに代表される変態的コーディングを行っているソースでは,かなり修正が必要です.
boost自身も現状ではビルドできません(boost-1.34.1で確認)
未修正のバグ
2007/12/7現在 GCC 4.3はまだ開発段階で正式リリースはされていません.致命的なバグもいくつかあります.以下,見つけたバグを列挙してみます.
linux kernel がコンパイルできない(gcc bug #32044, Kernel Bug Tracker Bug #8501)
開発版のGCC 4.3 でlinux kernelをコンパイルには workaround が必要です.具体的には以下のように kernelのMakefileを修正します.
# disable pointer signed / unsigned warnings in gcc 4.0 KBUILD_CFLAGS += $(call cc-option,-Wno-pointer-sign,) +# workaround to avoid gcc 4.3 emitting libgcc calls (see gcc bug #32044) +KBUILD_CFLAGS += $(call cc-option,-fno-tree-scev-cprop,) + # Add user supplied CPPFLAGS, AFLAGS and CFLAGS as the last assignments # But warn user when we do so warn-assign = \
この件については,linux kernel 側と gcc 側とで意見が割れているようで,解決にはもうしばらく時間が掛りそうです.
各ディストリビューションの対応状況
という状況です.