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)
gcc と clang のデフォルト C 言語規格は
gnu11(ISO C11 + GNU 拡張)です。g++ と clang++ のデフォルト C++ 言語規格は
gnu++14(ISO C++14 + GNU拡張)です。
s006 から s007 まで(GCC 10.3.0/Clang 12.0.1)
gcc と clang のデフォルト 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__