GCC(GNU Compiler Collection)不同版本默认使用的 C 语言标准随着版本的变化而有所不同。以下是主要 GCC 版本的默认 C 语言标准:
GCC 版本 | 默认 C 语言标准 |
---|---|
GCC 2.x | C89(ANSI C) |
GCC 3.x | C89(ANSI C) |
GCC 4.x | C89(ANSI C),但部分版本支持 gnu89 |
GCC 5.x | gnu89(GNU C89,带 GNU 扩展) |
GCC 6.x | gnu11(GNU C11,带 GNU 扩展) |
GCC 7.x | gnu11 |
GCC 8.x | gnu11 |
GCC 9.x | gnu11 |
GCC 10.x | gnu17(GNU C17,带 GNU 扩展) |
GCC 11.x | gnu17 |
GCC 12.x | gnu17 |
GCC 13.x | gnu17 |
说明:
gnuXX
标准(如gnu89
,gnu11
,gnu17
)表示基于cXX
标准,但增加了一些 GNU 扩展特性。c89
,c99
,c11
,c17
,c23
等表示标准 C 语言(不带 GNU 扩展)。- 你可以通过
gcc -v
或gcc -dumpversion
查看 GCC 版本,并使用gcc -E -dM - < /dev/null | grep __STDC_VERSION__
确认默认的__STDC_VERSION__
值。 - 要指定不同的 C 标准,可以使用
-std=cXX
或-std=gnuXX
选项,如:gcc -std=c99 myfile.c -o myfile
➜ /home/mi gcc -E -dM - < /dev/null | grep __STDC_VERSION__
#define __STDC_VERSION__ 201710L
➜ /home/mi
这条命令的输出:
#define __STDC_VERSION__ 201710L
表示 GCC 默认使用的 C 语言标准是 C17(ISO/IEC 9899:2018)。
解释:
-
gcc -E -dM - < /dev/null
:-E
:只进行预处理,不进行编译。-dM
:输出所有的宏定义(包括 GCC 预定义的宏)。- < /dev/null
:输入空文件(即不处理任何源代码,只打印 GCC 预定义的宏)。
-
grep __STDC_VERSION__
:- 过滤出
__STDC_VERSION__
这个宏,它表示 C 语言标准的版本。
- 过滤出
-
__STDC_VERSION__
的值:199409L
→ C94(C89 + C95 修订)199901L
→ C99201112L
→ C11201710L
→ C17(GCC 10+ 默认)202311L
→ C23(如果支持)
你的 GCC 版本默认使用 gnu17
(GNU C17)标准,因为 GCC 10 及以上版本的默认 C 标准是 gnu17
(即 C17 + GNU 扩展)。你可以用以下命令确认你的 GCC 版本:
gcc --version
如果你想切换到其他 C 语言标准,可以使用 -std=
选项:
gcc -std=c99 myfile.c -o myfile # 使用 C99
gcc -std=c11 myfile.c -o myfile # 使用 C11
gcc -std=c17 myfile.c -o myfile # 使用 C17
gcc -std=c23 myfile.c -o myfile # 使用 C23(如果支持)
参考链接:
- 所有Gcc版本对C和C++的支持情况(超详细版本)
- https://gcc.gnu.org/releases.html