C 言語を例にとると、プログラミング言語は、C89 (C90 と呼ばれることもある)、C94 (C89 の改訂版)、C99、C11、C17、現在開発中の新しい C2X 標準など、これまでに多くのバージョンを繰り返してきました。 .これらの標準に基づいても、GCC コンパイラー自体が C 言語の文法を拡張し、GNU90、GNU99、GNU11、および GNU17 の 4 つのバージョンを連続して作成しました。
興味深いことに、C 言語に対する GCC コンパイラの多くの拡張機能が、C 言語標準委員会によって採用され、新しい C 言語標準に追加されることがよくあります。たとえば、GNU90 の C 言語の一部の拡張機能は新しい C99 標準に統合され、GNU90 および GNU99 の C 言語の一部の拡張機能は新しい C11 標準に統合されています。
C++ 言語の開発も、C++98、C++03 (C++98 の改訂版)、C++11 (C++0x と呼ばれることもある)、C++ など、多くのバージョンを経てきました。 14 、C++17、および今後の C++20 の新しい標準。 C 言語と同様に、GCC コンパイラ自体も、GNU++98、GNU++11、GNU++14、GNU++17 などのさまざまな C++ 標準に対応する拡張機能を作成しています。
読者は、非常に多くの標準がある中で、GCC コンパイラーはどの標準を使用しているのかと尋ねるかもしれません。 GCC コンパイラのバージョンが異なれば、デフォルトで異なる標準バージョンが使用されます。最新の GCC 10.1.0 バージョンを例にとると、デフォルトでは、GCC コンパイラは C 言語プログラムを GNU11 標準 (C11 標準の拡張バージョン) でコンパイルし、C 言語プログラムを GNU++14 標準 ( C++14 標準の拡張バージョン) C++ プログラムをコンパイルします。
興味のある読者は、 GCC マニュアルで、さまざまなバージョンの GCC コンパイラで使用されるデフォルトのコンパイル標準を見つけることができます。
では、GCC コンパイラが使用するコンパイル標準を手動で制御できますか? C および C++ プログラムをコンパイルする場合、-std オプションを使用して、プログラムのコンパイル時に GCC が使用するコンパイル標準を手動で制御できます。つまり、gcc コマンドを使用して C 言語プログラムをコンパイルする場合、-std オプションを使用して、使用するコンパイル標準を指定できます; 同様に、g++ コマンドを使用して C++ プログラムをコンパイルする場合、使用することもできます使用するコンパイル標準を指定する -std オプション。
-std オプションの使用は非常に簡単で、その基本的な形式は次のとおりです。
gcc/g++ -std= 標準をコンパイル
GCC コンパイラのバージョンが異なれば、サポートされる C/C++ コンパイル標準も異なることに注意してください。表 1 に、C 言語コンパイル標準をサポートする、一般的に使用される GCC バージョンを示します。
GCC バージョン | C言語のよく使われる規格 | |||||||
---|---|---|---|---|---|---|---|---|
C89/C90 | C99 | C11 | C17 | GNU90 | GNU99 | GNU11 | GNU17 | |
10.1~8.4 | c89/c90 | c99 | c11 | c17/c18 | gnu90/gnu89 | gnu99 | gnu11 | gnu17/gnu18 |
7.5~5.5 | c89/c90 | c99 | c11 | gnu90/gnu89 | gnu99 | gnu11 | ||
4.9.4 ~ 4.8.5 | c89/c90 | c99 | c11 | gnu90/gnu89 | gnu99 | gnu11 | ||
4.7.4 | c89/c90 | c99 (部分的にサポート) | c11 (部分的にサポート) | gnu90/gnu89 | gnu99 (部分的にサポート) | gnu11 (部分的なサポート) | ||
4.6.4 | c89/c90 | c99 (部分的にサポート) | c1x (部分的にサポート) | gnu90/gnu89 | gnu99 (部分的にサポート) | gnu1x (部分的にサポート) | ||
4.5.4 | c89/c90 | c99 (部分的にサポート) | gnu90/gnu89 | gnu99 (部分的にサポート) |
なお、ヘッダーは各コンパイル規格の名称を示し、表の中は-std=c89、-std=c11、-std=gnu90など、-stdで利用可能な値です(同じことが表 2 にも当てはまります)。
表 2 に、C++ プログラム コンパイル標準をサポートする、一般的に使用される GCC バージョンを示します。
GCC バージョン | C++ 共通規格 | |||||||
---|---|---|---|---|---|---|---|---|
C++98/03 | C++11 | C++14 | C++17 | GNU++98 | GNU++11 | GNU++14 | GNU++17 | |
10.1~8.4 | c++98/c++03 | c++11 | c++14 | c++17 | gnu++98/gnu++03 | gnu++11 | gnu++14 | gnu++17 |
7.5~5.5 | c++98/c++03 | c++11 | c++14 | c++1z (部分的なサポート) | gnu++98/gnu++03 | gnu++11 | gnu++14 | gnu++1z (部分的なサポート) |
4.9.4 ~ 4.8.5 | c++98/c++03 | c++11 | c++1y (部分的なサポート) | gnu++98/gnu++03 | gnu++11 | gnu++1y (部分的にサポート) | ||
4.7.4 | c++98 | c++11 (部分的なサポート) | gnu++98 | gnu++11 (部分対応) | ||||
4.6.4 | c++98 | c++0x (部分的なサポート) | gnu++98 | gnu++0x (部分的なサポート) | ||||
4.5.4 | c++98 | c++0x (部分的なサポート) | gnu++98 | gnu++0x (部分的なサポート) |
表 1 と 2 では、いくつかのバージョンは 2 つの表現で同じコンパイル標準に対応しています. たとえば、GCC コンパイラの 8.4 ~ 10.1 バージョンの場合、-std=c89 と -std=c90 は同じであり、両方とも C89 を使用します / C90規格。さらに、GCC コンパイラには他のバージョンがあり、読者は関連情報についてGCC のドキュメントを参照できます。
たとえば、次は C 言語のソース プログラムです。
[root@bogon demo]# ls
main.c
[root@bogon demo]# cat main.c
#include <stdio.h>
int main(){
for(int i=0;i<10;i++){
printf(“i=%d “,i);
}
}
c99 標準でコンパイルする場合は、現在のすべての GCC コンパイラ バージョンが C99 標準をサポートしていることを確認する前提で、次のコマンドを実行してコンパイルを完了できます。
[root@bogon デモ]# gcc -std=c99 main.c -o main.exe
[root@bogon デモ]# ./main.exe
i=0 i=1 i=2 i=3 i=4 i=5 i=6 i=7 i=8 i=9
ただし、変数 i を for ループで宣言することは、C89 標準に違反しています。つまり、main.c を C89 コンパイル標準でコンパイルすると、GCC コンパイラはエラーを報告します。
[root@bogon demo]# gcc -std=c89 main.c -o main.exe
main.c: In function ‘main’:
main.c:3: error: ‘for’ loop initial declarations are only allowed in C99 mode
main.c:3: note: use option -std=c99 or -std=gnu99 to compile your code
これはまた、プログラムを作成する前に、使用するコンパイル標準を明確にし、その標準で何が使用可能で何が使用できないかを明確に理解する必要があることも意味します。