如何配置CMake指定编译器严格仅使用C89标准而非C90
CMake配置严格纯C89编译环境的方法
首先明确一个核心事实:C89和C90是技术上完全等价的同一套C语言标准。C89是ANSI组织1989年发布的首个C语言正式标准,ISO组织1990年将其采纳为国际标准时仅调整了文档排版格式,没有修改任何技术条款,不存在"纯C89和C90有功能差异"的区别。
为什么set(CMAKE_C_STANDARD 89)会报错
CMake的CMAKE_C_STANDARD变量取值对齐ISO发布的C标准版本号,合法取值为90、99、11、17、23,不支持ANSI标准的89编号,直接写入89触发配置错误是符合设计逻辑的。值为90时对应的就是C89/C90这版最早的标准化C语言。
严格C89环境的正确配置
要让编译器严格遵循无扩展的纯C89规则,不能只设置CMAKE_C_STANDARD,需要同时配置三个参数:
# 指定使用C90(即C89)标准 set(CMAKE_C_STANDARD 90) # 强制要求编译器必须支持该标准,不允许自动降级到更低版本 set(CMAKE_C_STANDARD_REQUIRED ON) # 禁用所有编译器专属的方言扩展,比如GCC的GNU C扩展、MSVC的自定义语法扩展 set(CMAKE_C_EXTENSIONS OFF)
这套配置在主流编译器下的实际生效逻辑:
- GCC/Clang:会自动追加
-std=c89(和-std=c90参数完全等价)编译选项,禁用所有GNU非标准扩展 - MSVC:会自动追加
/Za编译选项,禁用微软自定义的C语法扩展,严格按C89规则做语法检查
如果需要更严格的校验,把所有偏离C89标准的写法直接判定为编译错误,可以额外追加兜底编译参数:
# 针对GCC/Clang增加严格校验 if(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang") add_compile_options(-pedantic-errors) endif()
加了这个参数后,任何使用C89之后才加入标准的语法、或者编译器自定义扩展语法的代码,都会直接编译失败,完全满足纯C89的编码要求。
内容的提问来源于stack exchange,提问作者user19261194
相关产品推荐
相关产品推荐

