C/C++ の言語規格について
デフォルトの言語規格
バージョン s002 以後、s007 までの gcc と clang が採用しているデフォルトの C 言語の規格は、 gnu11
(ISO C11 + GNU拡張)です。
注釈
s001 では gcc の C 言語の規格は、gnu89
(ANSI C + GNU拡張)でした。
同様に s002 以後、s007 までの g++ と clang++ が採用しているデフォルトの C++ 言語の規格は、 gnu++14
(ISO C++14 + GNU拡張)です。
注釈
s001 では g++ と clang++ の C++ 言語の規格は、 gnu++98
(ISO C++98 + GNU拡張)でした。
C 言語の規格は、以下のように -std
オプションで変更できます。
注釈
gnuXXX
以外のオプションを指定した場合、GNU 拡張は使用できません。GNU 拡張をサポートしないコンパイラでも移植性のあるコードを開発したい場合に指定してください。
- ANSI C に変更する場合
-std=c90
(-ansi
) または GNU 拡張有効の-std=gnu90
- ISO C99 に変更する場合
-std=c99
または-std=gnu99
- ISO C11 に変更する場合
-std=c11
または-std=gnu11
C++ でも同様に -std
オプションで変更できます。
- ISO C++98 に変更する場合
-std=c++98
または GNU 拡張有効の-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__