有趣的是,GCC编译器对C语言的许多扩展经常被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 编译器本身创建了各种 C++ 标准的扩展,包括 GNU++98、GNU++11、GNU++14 和 GNU++17。 读者可能会问,这么多标准,GCC编译器使用哪一个呢?不同版本的GCC编译器默认使用不同的标准版本。以最新的GCC 10.1.0版本为例,默认情况下GCC编译器使用GNU11标准(C11标准的扩展版本)编译C语言程序,使用GNU++14标准(C++)编译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版本。
| 海湾合作委员会版本 | C语言常用标准 | |||||||
|---|---|---|---|---|---|---|---|---|
| C89/C90 | C99 | C11 | C17 | GNU90 | GNU99 | GNU11 | GNU17 | |
| 10.1~8.4 | c89/c90 | c99 | c11 | c17/c18 | gnu90/gnu89 | gnu99 | 格努11 | gnu17/gnu18 |
| 7.5~5.5 | c89/c90 | c99 | c11 | gnu90/gnu89 | gnu99 | 格努11 | ||
| 4.9.4~4.8.5 | c89/c90 | c99 | c11 | gnu90/gnu89 | gnu99 | 格努11 | ||
| 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的可用值,例如-std=c89、-std=c11、-std=gnu90(表2同样适用) )。
表2列出了常用的支持C++程序编译标准的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 | 时间:2018-12-07 标签:c++11 | 时间:2019-03-14 标签:c++14 | 时间:2017-12-17 标签:c++17 | gnu++98/gnu++03 | gnu++11 | gnu++14 | gnu++17 |
| 7.5~5.5 | c++98/c++03 | 时间:2018-12-07 标签:c++11 | 时间:2019-03-14 标签:c++14 | c++1z(部分支持) | gnu++98/gnu++03 | gnu++11 | gnu++14 | gnu++1z(部分支持) |
| 4.9.4~4.8.5 | c++98/c++03 | 时间:2018-12-07 标签: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中,有些版本对应相同的编译标准有两种表示方式,例如对于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 demo]# gcc -std=c99 main.c -o main.exe [root@bogon demo]# ./main.exe i=0 i=1 i=2 i=3 i=4 i=5我=6 我=7 我=8 我=9
但是,在 for 循环中声明变量 i 违反了 C89 标准。这意味着如果你用C89编译标准编译main.c,GCC编译器会报错。
[root@bogon demo]# gcc -std=c89 main.c -o main.exe main.c: In function ‘main’: main.c:3: error: ‘for’ 循环初始声明仅在 C99 模式下允许main.c:3:注意:使用选项 -std=c99 或 -std=gnu99 编译代码
这也意味着在编写程序之前,您需要明确要使用的编译标准,并清楚地了解该标准可用和不可用的内容。




![2021 年如何设置 Raspberry Pi Web 服务器 [指南]](https://i0.wp.com/pcmanabu.com/wp-content/uploads/2019/10/web-server-02-309x198.png?w=1200&resize=1200,0&ssl=1)

