GCC -std编译标准一览表
以 C 语言为例,发展今该编程语言已经迭代了诸多个版本,例如 C89(偶尔又称为 C90)、C94(C89 的修订版)、C99、C11、C17,以及当下正在开发的 C2X 新标准。甚于在这些标准的基础上,GCC 编译器本身还对 C 语言的语法进行了扩展,先后产生了 GNU90、GNU99、GNU11 以及 GNU17 这 4 个版本。
有趣的是,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++14 标准的扩展版)编译 C++ 程序。
那么,我们可以手动控制 GCC 编译器使用哪个编译标准吗?答案是肯定的,对于编译 C、C++ 程序来说,借助 -std 选项即可手动控制 GCC 编译程序时所使用的编译标准。也就是说,当使用 gcc 指令编译 C 语言程序时,我们可以借助 -std 选项指定要使用的编译标准;同样,当使用 g++ 指令编译 C++ 程序时,也可以借助 -std 选项指定要使用的编译标准。关于不同版本的 GCC 编译器,默认使用的编译标准,感兴趣的读者可自行到 GCC 手册中查找。
-std 选项的使用方式很简单,其基本格式如下:
gcc/g++ -std=编译标准
注意,不同版本的 GCC 编译器,所支持使用的 C/C++ 编译标准也是不同的。表 1 罗列了常用的 GCC 版本对 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 | 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(部分支持) |
|
|
表 2 罗列了常用的 GCC 版本对 C++ 程序编译标准的支持程度。注意,表头表示的是各个编译标准的名称,而表格内部的则为 -std 可用的值,例如 -std=c89、-std=c11、-std=gnu90 等(表 2 也是如此)。
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 种表示方式,例如对于 8.4~10.1 版本的 GCC 编译器来说,-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 i=6 i=7 i=8 i=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’ loop initial declarations are only allowed in C99 mode
main.c:3: note: use option -std=c99 or -std=gnu99 to compile your code
这也就意味着,在编写程序前必须明确要使用的编译标准,并清楚得知道该标准下什么可用,什么不可用。
- 随机文章
- 印度驻扎马尔代夫(印度军队进驻马尔代夫,维护地区安全 )
- 南航马尔代夫公告(南航发布关于马尔代夫航班调整的通知)
- 孕妇旅游马尔代夫(孕期旅游推荐:马尔代夫岛屿度假体验)
- 怎么出发马尔代夫(从哪里开始,探索马尔代夫:旅行指南)
- 微信 马尔代夫(马尔代夫:热带天堂等你来!)
- 中国 马尔代夫 签证(中马签证正式签署 生疏双方商务合作)
- 颜料 马尔代夫(马尔代夫:色彩斑斓的天堂)
- 欧美马尔代夫美女(美女游客在欧美马尔代夫享受美好时光)
- 蝠鲼 马尔代夫(马尔代夫发现罕见鱼类:蝠鲼)
- 热浪 马尔代夫(马尔代夫酷暑难挡,热浪来袭!)
- 玉林马尔代夫大门(玉林镶嵌马尔代夫,营造热带海岛风情)
- 机灵姐去马尔代夫(机灵姐游走马尔代夫:探索海底世界!)
- 荆门漳河马尔代夫(湖北荆门漳河打造马尔代夫式水上乐园)
- 汤院 马尔代夫(汤院:体验马尔代夫风情的绝佳选择)
- 芷江马尔代夫房价(芷江将投资马尔代夫房产:价格更亲民)
- 蜜月马尔代夫费用(惊喜蜜月之旅:马尔代夫必备费用攻略)
- 马尔代夫中国城市(中国城在马尔代夫崛起,新兴旅游热点)
- 马尔代夫义工费用(参加马尔代夫义工项目的费用是多少?)
- 直飞马尔代夫旅游(直达马尔代夫的旅游方案,快来了解!)
- 重庆南岸马尔代夫(重庆南岸上线首家马尔代夫风情度假村)
- 福建马尔代夫论坛(福建和马尔代夫互动交流论坛成功举办)
- 贵溪马尔代夫夜景(重温贵溪马尔代夫夜景,惊叹自然美景)
- 马尔代夫传统艺术(马尔代夫传统工艺——手工编织新生活)
- 莆田马尔代夫餐厅(莆田美食登陆马尔代夫,尝遍异国美味)
- 青岛马尔代夫攻略(青岛出发,轻松玩转美丽的马尔代夫!)
- 情侣游玩马尔代夫(情侣之间的理想目的地:浪漫马尔代夫)
- 马尔代夫亚明资金(马尔代夫亚明资金涉嫌虚假宣传被调查)
- 翱翔 马尔代夫(飞翔于神秘之地:探寻马尔代夫)
- 马尔代夫人均旅游(马尔代夫游人均开销:旅游钱花得值!)
- 马尔代夫出海旅游(美不胜收!马尔代夫海底世界探秘之旅)
