clang支持的c标准标识符包括:-std=c89(等价于iso9899:1990)、-std=c99(支持inline、restrict、vla等)、-std=c11(启用原子操作、_generic、线程支持)、-std=c17/c18(修正缺陷,无新特性),以及-gnu扩展系列;需注意版本兼容性与cmake正确配置方式。

-std 参数必须显式指定,Clang 不会继承系统默认标准(比如 GCC 默认 C89,Clang 默认 C99),不设就按自身规则 fallback,容易引发隐性兼容问题。
哪些 -std 值对应 C 标准
Clang 支持的 C 标准标识符和实际含义有细微差别,尤其注意大小写和拼写:
-
-std=c89和-std=iso9899:1990等价,即 ANSI C / C89 / C90;Clang 接受c89,但不推荐用c90(某些旧版 Clang 会报错) -
-std=c99是最常用兼容档位,支持inline、restrict、变长数组(VLA)等特性 -
-std=c11启用原子操作、泛型选择器(_Generic)、线程支持等,但部分嵌入式平台 libc 可能未实现 -
-std=c17(也写作c18)主要修正缺陷,无新增语言特性;Clang 12+ 完全支持 -
-std=gnuXX(如-std=gnu11)开启 GNU 扩展,比如内联汇编、语句表达式;但跨平台项目应避免
CMake 中设置 -std 的两种可靠方式
直接写 CMAKE_C_FLAGS 容易被后续配置覆盖,推荐用标准接口:
Clang 22.1.3 Windows 64 位历史版本安装包,适合旧项目兼容、LLVM/Clang 工具链回退、编译行为对比、链接问题复现和 C/C++ 构建环境维护。
- 全局设定(推荐):
set(CMAKE_C_STANDARD 99)—— 数字形式,CMake 自动转为-std=c99,且会统一处理 C++ 对应项 - 局部设定(单 target):
set_property(TARGET my_target PROPERTY C_STANDARD 11)—— 更精确,不影响其他 target - 若必须硬编码参数,用
add_compile_options(-std=c11),但注意它对所有源文件生效,包括第三方库
常见错误:-std 不生效或报错
现象多是编译时仍出现 C99 特性报错(如 for (int i = 0; ...) 被拒),或 error: unknown standard 'c17':
- Clang 版本太低:C17 需 Clang 6.0+,C23 需 Clang 14.0+;用
clang --version确认 - CMake 缓存未清除:改了
CMAKE_C_STANDARD后必须删掉build/目录重跑cmake ..,否则缓存沿用旧值 - 与
-pedantic冲突:-std=c99 -pedantic会拒绝 GNU 扩展,但若项目里用了__attribute__就会失败;调试时先去掉-pedantic - IDE 混淆:CLion 或 VS Code 的 C/C++ 插件可能只读取
compile_commands.json,而该文件生成依赖 CMake 是否真正写入了-std,建议用make VERBOSE=1验证命令行是否含目标参数
最易被忽略的是:Clang 的 -std 不控制预处理器行为,__STDC_VERSION__ 宏的值才反映实际生效标准,加一行 #error __STDC_VERSION__ 编译看报错数字,比猜更准。
13万字C语言保姆级教程(深入):立即使用
在学习笔记中,你将探索c语言的核心概念和高级技巧!










