zhcn 编程语言 GCC -std 编译标准列表

GCC -std 编译标准列表

您应该知道,任何编程语言都有相关的组织和团体,并且不断维护和更新。原因很简单:时代在不断发展,如果一种编程语言停滞不前,它最终就会消失。以C语言为例,这些年来编程语言已经演化出很多,包括C89(有时称为C90)、C94(C89的修订版)、C99、C11、C17,以及目前正在开发的新C2X标准.我已经经历了几个版本。即使基于这些标准,GCC编译器本身也扩展了C语言语法并产生了四个连续的版本:GNU90、GNU99、GNU11和GNU17。

有趣的是,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版本。

表1 GCC各版本支持的C语言编译标准
海湾合作委员会版本 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版本。

表2 GCC各版本支持的C++编译标准
海湾合作委员会版本 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 编译代码

这也意味着在编写程序之前,您需要明确要使用的编译标准,并清楚地了解该标准可用和不可用的内容。

您应该知道,任何编程语言都有相关的组织和团体,并且不断维护和更新。原因很简单:时代在不断发展,如果一种编程语言停滞不前,它最终就会消失。以C语言为例,这些年来编程语言已经演化出很多,包括C89(有时称为C90)、C94(C89的修订版)、C99、C11、C17,以及目前正在开发的新C2X标准.我已经经历了几个版本。即使基于这些标准,GCC编译器本身也扩展了C语言语法并产生了四个连续的版本:GNU90、GNU99、GNU11和GNU17。

有趣的是,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版本。

表1 GCC各版本支持的C语言编译标准
海湾合作委员会版本 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版本。

表2 GCC各版本支持的C++编译标准
海湾合作委员会版本 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 编译代码

这也意味着在编写程序之前,您需要明确要使用的编译标准,并清楚地了解该标准可用和不可用的内容。