1. 引言随着 C 标准的不断演进C23 引入了许多新特性和改进如std::expected、std::print、std::mdspan等。要在你的 C 项目中使用这些新特性首先需要在构建系统中正确配置 C23 标准。CMake 是目前最流行的跨平台构建系统之一本文将详细介绍如何在CMakeLists.txt文件中设置 C23 标准。2. 设置 C 标准的方法CMake 提供了多种方式来指定 C 标准以下是几种常用方法从现代到传统排序。2.1 使用target_compile_features推荐这是最现代、最推荐的方式它允许你为特定的目标可执行文件或库指定所需的 C 特性CMake 会自动推导出所需的最低标准版本。cmake_minimum_required(VERSION 3.20) project(MyProject) add_executable(my_app main.cpp) 为 my_app 目标启用 C23 标准 target_compile_features(my_app PRIVATE cxx_std_23)优点语义清晰与目标绑定CMake 会自动处理兼容性。注意需要 CMake 3.20 或更高版本才能识别cxx_std_23。2.2 使用set_target_properties设置CXX_STANDARD你可以直接为目标设置CXX_STANDARD属性。cmake_minimum_required(VERSION 3.8) project(MyProject) add_executable(my_app main.cpp) 设置 my_app 目标使用 C23 标准 set_target_properties(my_app PROPERTIES CXX_STANDARD 23 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF )参数解释CXX_STANDARD 23指定使用 C23 标准。CXX_STANDARD_REQUIRED ON要求编译器必须支持 C23否则配置失败。CXX_EXTENSIONS OFF禁用编译器扩展如 GNU 扩展确保使用标准的 ISO C。2.3 使用全局变量CMAKE_CXX_STANDARD如果你希望项目中所有目标都使用同一个 C 标准可以设置全局变量。cmake_minimum_required(VERSION 3.1) project(MyProject) 为项目中所有目标设置 C23 标准 set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) add_executable(my_app main.cpp) add_library(my_lib STATIC lib.cpp)注意此设置会影响之后定义的所有目标。3. 检查编译器支持并非所有编译器都完全支持 C23。你可以在CMakeLists.txt中添加检查或在配置时给出提示。# 检查编译器是否声称支持 C23 include(CheckCXXCompilerFlag) check_cxx_compiler_flag(-stdc23 COMPILER_SUPPORTS_CXX23) if(COMPILER_SUPPORTS_CXX23) message(STATUS 编译器支持 C23) else() message(WARNING 当前编译器可能不支持完整的 C23 标准某些特性可能不可用。) endif()4. 完整示例下面是一个完整的CMakeLists.txt示例演示了如何为一个简单的项目设置 C23 标准。cmake_minimum_required(VERSION 3.20) project(MyCpp23Project VERSION 1.0.0 LANGUAGES CXX) 方法1全局设置可选与方法2任选其一 set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) 添加可执行文件 add_executable(my_app main.cpp) 方法2为目标设置推荐 target_compile_features(my_app PRIVATE cxx_std_23) 或者使用 set_target_properties set_target_properties(my_app PROPERTIES CXX_STANDARD 23 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF ) 可选添加包含目录、链接库等 target_include_directories(my_app PRIVATE include) target_link_libraries(my_app PRIVATE some_library)5. 常见问题与解决5.1 配置失败提示 “Cannot specify compile features for target ...”原因target_compile_features需要在add_executable或add_library之后调用。解决确保调用顺序正确。5.2 编译器报错不认识 C23 特性可能原因编译器版本过低如 GCC 13, Clang 16, MSVC 19.34。CMake 生成的编译命令未正确包含-stdc23标志。解决升级编译器。检查 CMake 生成的构建文件如build.ninja或Makefile确认是否有-stdc23标志。尝试显式设置编译标志不推荐可能破坏跨平台性target_compile_options(my_app PRIVATE -stdc23)5.3 我想同时支持 C17 和 C23 怎么办通常为整个项目选择一个标准。如果库需要支持多标准可以考虑使用条件编译或提供不同的构建目标。6. 总结在CMakeLists.txt中设置 C23 标准主要有三种方式最推荐使用target_compile_features(my_target PRIVATE cxx_std_23)需要 CMake 3.20。使用set_target_properties设置CXX_STANDARD等属性。设置全局变量CMAKE_CXX_STANDARD。建议始终设置CXX_STANDARD_REQUIRED ON和CXX_EXTENSIONS OFF以确保严格的标准符合性和可移植性。配置后即可在代码中安全地使用 C23 的新特性。