clang支持的c标准标识符包括-std=c89/-std=ansi、-std=c99、-std=c11、-std=c17/-std=c18及-gnuxx系列,其中-c17等价于-c11加修复,而-gnuxx启用iso标准加gnu扩展;默认行为即-std=gnu17,严格合规需配合-pedantic或-pedantic-errors。

Clang命令行指定C语言标准,直接用 -std= 参数即可,但必须注意:不同标准值对应不同语法支持,且部分旧标准(如 c89)在新版Clang中已弃用或行为受限。
哪些 -std= 值可用?
Clang支持的C标准标识符与GCC基本一致,但不是所有都默认启用:
-
-std=c89或-std=ansi:启用C89/ANSI C,但Clang 14+默认禁用某些扩展(如隐式函数声明),需配合-pedantic才严格合规 -
-std=c99:支持变长数组、restrict、内联函数等,Clang自3.0起完全支持 -
-std=c11:引入原子操作、泛型选择(_Generic)、静态断言(_Static_assert) -
-std=c17或-std=c18:C17是C11的修正版,无新增语法;Clang 9+默认启用,-std=c17实际等价于-std=c11加若干修复 -
-std=gnuXX(如-std=gnu11):启用对应ISO标准 + GNU扩展(如嵌套函数、语句表达式),这是Clang默认行为(不加-std时即为-std=gnu17)
为什么加了 -std=c90 还报错?
常见现象:代码里用了 // 注释或隐式 int 返回类型,却仍编译通过——这是因为Clang默认开启GNU扩展。真正想跑纯ANSI C,必须显式关闭扩展:
Clang 22.1.3 Windows 64 位历史版本安装包,适合旧项目兼容、LLVM/Clang 工具链回退、编译行为对比、链接问题复现和 C/C++ 构建环境维护。
- 只写
clang -std=c90 file.c不够,Clang仍允许GNU扩展 - 正确做法是加
-pedantic:clang -std=c90 -pedantic file.c,此时//注释会报错 - 若还需禁止所有扩展(包括Clang自己的),可加
-pedantic-errors,让警告变成错误
Clang和GCC在C标准处理上的关键差异
Clang对标准合规性更严格,尤其在诊断信息和扩展控制上:
- Clang默认不接受
long long在C99之前的标准中使用,而GCC在-std=c89下可能容忍 -
-std=c11下,Clang要求_Atomic类型必须配<stdatomic.h></stdatomic.h>,GCC有时放宽 - Clang 16+ 对
-std=c99禁用了某些C11特性(如_Static_assert),即使你手动定义宏也无法绕过 - 跨平台项目建议统一用
-std=c11 -pedantic,它在Clang/GCC/MSVC(via clang-cl)上兼容性最好
实际写的时候别只盯着 -std=,-pedantic 和 -Wall 得一起上,否则你以为自己在写C99,其实编译器早悄悄放行了GNU扩展。标准版本只是开关,是否真按标准走,得靠诊断选项来卡死。
13万字C语言保姆级教程(深入):立即使用
在学习笔记中,你将探索c语言的核心概念和高级技巧!










