C/C++ の言語規格について

デフォルトの言語規格

exeGCC(ツールチェーンバージョン s001 から s007 まで)

s001(GCC 4.9.4/Clang 4.0.0)

gcc のデフォルト C 言語規格は gnu90 (ISO C90 + GNU 拡張)です。

注釈

ISO C90 は策定した組織と年代が異なるだけで ANSI C89( -ansi )と同じ仕様です。

clang のデフォルト C 言語規格は gnu11 (ISO C11 + GNU 拡張)です。

g++clang++ のデフォルト C++ 言語規格は gnu++98 (ISO C++98 + GNU拡張)です。

s002 から s005 まで(GCC 6.4.0/Clang 6.0.0)

gccclang のデフォルト C 言語規格は gnu11 (ISO C11 + GNU 拡張)です。

g++clang++ のデフォルト C++ 言語規格は gnu++14 (ISO C++14 + GNU拡張)です。

s006 から s007 まで(GCC 10.3.0/Clang 12.0.1)

gccclang のデフォルト C 言語規格は gnu17 (ISO C17 + GNU 拡張)です。

g++clang++ のデフォルト C++ 言語規格は gnu++14 (ISO C++14 + GNU拡張)です。

注釈

C17 は C11 規格文面のバグフィックス版なので、C11 と同じ仕様です。

exeClang(ツールチェーンバージョン s008 以降)

注釈

GCC( gcc および g++ )はサポートされません。

s008(Clang 18.1.8)、s009(Clang 19.1.7)

clang のデフォルト C 言語規格は gnu17 (ISO C17 + GNU 拡張)です。

clang++ のデフォルト C++ 言語規格は gnu++17 (ISO C++17 + GNU 拡張)です。

言語規格の指定オプション

C 言語規格は、以下のように -std オプションで変更できます。

注釈

GNU 拡張有効を意味する gnuXXX 以外のオプションを指定した場合、GNU 拡張は使用できません。GNU 拡張をサポートしないコンパイラでも移植性のあるコードを開発したい場合に指定してください。

ANSI C に変更する場合

-std=c90 ( -std=c89 または -ansi ) または -std=gnu90 ( -std=gnu89 )

ISO C99 に変更する場合

-std=c99 または -std=gnu99

ISO C11 に変更する場合

-std=c11 または -std=gnu11

C++ でも同様に -std オプションで言語規格を変更できます。

ISO C++98 に変更する場合

-std=c++98 または -std=gnu++98

ISO C++11 に変更する場合

-std=c++11 または -std=gnu++11

ISO C++14 に変更する場合

-std=c++14 または -std=gnu++14

SOLID が使用している GNU 拡張の例

  • asm 文によるインラインアセンブラ

    GNU 拡張が有効になっていない場合、 warning: implicit declaration of function 'asm' [-Wimplicit-function-declaration] のようなわかりにくい警告が出て、正常動作しません。

コンパイラの独自拡張ですが、GNU 拡張では無い例(gnuXXX 未指定の場合でも使用できます。)

  • pragma__attribute__