You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 10:51:22