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

デフォルトの言語規格

ツールチェーン s006 の gccclang が採用しているデフォルトの C 言語の規格は、 gnu11 (ISO C11 + GNU拡張)です。 s002, s005も同様です。

注釈

s001 は gcc の C 言語の規格は、 gnu89 (ANSI C + GNU拡張)でした。

g++clang++ が採用しているデフォルトの C++ 言語の規格は、 gnu++14 (ISO C++14 + GNU拡張)です。 s002, s005も同様です。

注釈

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__