如何在Ubuntu 20.04下将GCC 9.3.0/Clang-11的默认C版本设为C11或C99?
基于Ubuntu 20.04(GCC 9.3.0 / Clang-11)配置指定默认C编译标准的操作步骤
前置说明
GCC 8及更高版本在编译时未显式传入-std参数时,默认会启用带GNU扩展的C17标准,对应代码中判定的C18版本,这也是你当前编译直接输出C18提示的原因。
你可以根据实际使用场景选择两类配置方案:单次编译临时指定标准,或者全局永久修改默认编译参数。
单次编译临时指定C标准
这类配置不改动全局默认参数,仅对当前单次编译操作生效,适合单项目适配特定C标准的场景:
- GCC编译场景:在原有编译命令后追加对应标准参数
- 指定C11标准:追加
-std=c11(纯标准兼容)或-std=gnu11(带GNU扩展) - 指定C99标准:追加
-std=c99或-std=gnu99
示例:编译test.c生成可执行文件,指定C11标准的命令为gcc test.c -std=c11 -o test
- 指定C11标准:追加
- Clang-11编译场景:参数逻辑和GCC完全一致
- 指定C11标准:
clang-11 test.c -std=c11 -o test - 指定C99标准:
clang-11 test.c -std=c99 -o test
- 指定C11标准:
全局永久修改默认C编译标准
这类配置完成后,后续所有终端调用对应编译器的场景都会默认带上指定的C标准参数,无需每次手动输入:
针对GCC 9.3的配置
- 打开当前用户的shell配置文件,使用bash就编辑
~/.bashrc,使用zsh就编辑~/.zshrc - 在文件末尾追加对应别名:
- 全局默认C11:
alias gcc='gcc -std=c11' - 全局默认C99:
alias gcc='gcc -std=c99'
- 全局默认C11:
- 执行
source ~/.bashrc让配置立即生效 - 如果需要对系统所有登录用户生效,可在
/etc/profile.d/目录下新建gcc-c-std.sh脚本,写入上面的alias语句,给脚本加可执行权限后重启shell即可。
针对Clang-11的配置
和GCC的配置逻辑完全一致,在~/.bashrc末尾追加对应别名即可:
- 全局默认C11:
alias clang-11='clang-11 -std=c11' - 全局默认C99:
alias clang-11='clang-11 -std=c99'
特殊场景注意事项
- 如果项目使用Make、CMake等构建系统,且配置文件内硬编码调用了编译器的绝对路径(比如直接写
/usr/bin/gcc),shell别名不会生效,需要在构建系统的配置中手动追加对应C标准参数:- Makefile场景:在
CFLAGS变量中追加-std=c11(或-std=c99) - CMake场景:在
CMakeLists.txt中追加set(CMAKE_C_STANDARD 11)(或99)
- Makefile场景:在
配置生效验证
完成配置后重新编译最开始的C标准检测代码,运行生成的可执行文件:
- 输出
We are using C11!说明C11配置已生效 - 输出
We are using C99!说明C99配置已生效
内容的提问来源于stack exchange,提问作者Kevin Mahendra
相关产品推荐
相关产品推荐

