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

CMake设置C++版本应使用CMAKE_CXX_STANDARD还是CXX_STANDARD?

二者核心差异

1. CMAKE_CXX_STANDARD:全局默认配置变量

这是CMake官方定义的全局作用域变量,设置后会自动作用于当前项目中所有后续创建的C目标(包括可执行文件、静态/动态库等),相当于给整个项目的C标准设了统一默认值。
一般用法是直接在项目根目录的CMakeLists.txt最上方配置:

set(CMAKE_CXX_STANDARD 17)
# 可选配置:要求编译器必须支持指定版本,不支持就直接报错终止
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 可选配置:禁用编译器的非标准扩展(比如MSVC的/Za、GCC的-std=c++17而非-std=gnu++17)
set(CMAKE_CXX_EXTENSIONS OFF)

2. CXX_STANDARD:单目标属性

不带前缀的CXX_STANDARD是单个C++目标的专属属性,仅作用于指定目标,不会影响其他目标,用来给个别目标单独配置不同于全局默认的C++标准版本。
正确用法是在目标定义之后,通过属性设置命令指定:

add_executable(my_app main.cpp)
# 仅给my_app这个可执行文件设置C++20标准,不影响项目里的其他目标
set_target_properties(my_app PROPERTIES
  CXX_STANDARD 20
  CXX_STANDARD_REQUIRED ON
  CXX_EXTENSIONS OFF
)

为什么测试时没感觉到差异?

你测试时没发现区别大概率是两个原因:

  1. 你的编译器默认C版本就是你设置的版本(比如新版本GCC/Clang默认就是C17,MSVC 2022默认是C++14或更高),就算不主动配置也会用对应版本编译
  2. 你可能直接全局写了set(CXX_STANDARD 17),但这个写法本身是无效的,CMake不会读取这个全局变量,实际生效的还是你之前配置的CMAKE_CXX_STANDARD或者编译器默认值,所以没感知到变化。

使用建议

  • 绝大多数场景直接用CMAKE_CXX_STANDARD做全局统一配置即可,写法更简单,也能避免项目里不同目标标准不统一的问题
  • 只有当项目中个别目标需要用和全局不一样的C++标准时,再用CXX_STANDARD目标属性单独配置即可

内容的提问来源于stack exchange,提问作者JAYD3V

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:36:04