CMake 3.17.5(CentOS7)设置CXX_STANDARD=11却用C90编译的原因咨询
问题分析:CMake配置C++标准却触发C90编译错误的原因
问题场景
CMakeLists.txt中配置了C++11标准:
set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON)
但编译时出现C90相关的警告与错误:
warning: ISO C90 forbids mixed declarations and code [-Wpedantic]
error: 'for' loop initial declarations are only allowed in C99 mode
改用CMAKE_C_STANDARD配置后问题完全解决。
核心原因
- C与C++标准配置变量互不干扰
CMAKE_CXX_STANDARD仅作用于C++编译单元(.cpp、.cxx等后缀文件),对C语言编译单元(.c后缀文件)无效。GCC4这类老版本的C编译器默认采用C90标准,这是C语言的早期基础标准。 - 错误来自C源文件的编译
报错信息里的限制都是C90的特性:C90要求变量必须放在代码块开头声明,不允许在代码中间或for循环初始化部分直接声明变量(比如for(int i=0; i<10; i++))。这些写法在C11中是合法的,说明编译报错的是项目中的C源文件,而非C文件。 CMAKE_C_STANDARD的作用
当配置CMAKE_C_STANDARD(比如设为99)时,CMake会给C编译器传递-std=c99参数,让C源文件以C99标准编译,自然支持了for循环内声明变量等特性,解决了错误和警告。
总结
如果项目同时包含C和C++源文件,需要分别配置对应语言的编译标准:
- 用
CMAKE_CXX_STANDARD指定C++标准 - 用
CMAKE_C_STANDARD指定C语言标准
内容的提问来源于stack exchange,提问作者無名前
相关产品推荐
相关产品推荐

