clion中启用c++20需在cmakelists.txt中设置set(cmake_cxx_standard 20)、set(cmake_cxx_standard_required on)和set(cmake_cxx_extensions off),ide界面设置仅影响语法高亮,不传递给编译器。

CLion 默认不强制绑定某个 C++ 标准,但它的行为取决于你用的编译器、CMake 配置和工具链——不是在 Settings 里点几下就能“全局启用 C++20”的。关键点在于:C++ 标准由 CMAKE_CXX_STANDARD 和编译器实际能力共同决定,而 CLion 只是把它们串起来。
为什么改了 Settings 还不生效?
很多人在 File > Settings > Languages & Frameworks > C/C++ > Standard 里选了 C++20,结果 concept 报错、import 不识别——这是因为该设置只影响 CLion 自身的语法高亮和基础语义检查(比如是否标红 requires),**不传递给编译器**。真正起作用的是 CMake 配置。
- 这个下拉菜单只是 IDE 的“提示开关”,不是编译开关
- 如果你用的是 MinGW-w64 11.2+ 或 MSVC 19.30+,它能识别 C++20 语法;但若底层工具链不支持,IDE 再标绿也没用
- Clangd(用于高级语义)对 C++20 支持有限,部分特性(如 module 依赖图)仍靠内置引擎补全,但仅限解析和重构
CMakeLists.txt 中必须设的三行
这是最可靠、项目级生效的方式。所有 C++ 标准控制都应落在 CMake 配置里:
-
set(CMAKE_CXX_STANDARD 20)—— 告诉 CMake 用 C++20 编译所有 target(注意:数字 20,不是字符串 "C++20") -
set(CMAKE_CXX_STANDARD_REQUIRED ON)—— 禁止降级到低版本标准(否则 gcc 可能悄悄回退到 C++17) -
set(CMAKE_CXX_EXTENSIONS OFF)—— 关闭 GNU 扩展(如__attribute__风格),保证严格标准兼容性
示例片段:
cmake_minimum_required(VERSION 3.20) project(myapp LANGUAGES CXX) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) add_executable(myapp main.cpp)
MinGW/MSVC 工具链对 C++20 的真实支持边界
即使 CMake 写了 20,编译器也可能报错或静默忽略某些特性。常见断点:
-
import std;:仅 MSVC 19.33+ / Clang 16+(需配合CMAKE_EXPERIMENTAL_CXX_IMPORT_STDUUID);MinGW-w64 13.1+ 有实验支持,但需手动加-fmodules-ts且不稳定 -
std::format:MSVC 从 19.30 开始默认启用;MinGW-w64 13.1+ 需链接-lstdc++fs并确保启用了_GLIBCXX_USE_CXX11_ABI=1 -
constexpr virtual、deducing this:GCC 13+ / Clang 15+ 才完整支持,旧版 MinGW(如 11.2)会直接拒绝
验证方式:在终端进项目目录,执行 cmake -DCMAKE_CXX_STANDARD=20 .,看是否报 unknown option 或 not supported。
模块(module)在 CLion 中的特殊处理
CLion 对 import 的索引和跳转支持弱于头文件,尤其跨 module 边界时容易丢失符号。要让它工作,除了 CMake 设置,还需:
- 确保
CMAKE_CXX_COMPILER_IMPORT_STD在 configure 阶段输出为TRUE(可通过message(STATUS "...")检查) - 每个
.cppm文件必须显式声明export module xxx;,且import语句不能出现在 header 中 - CLion 2024.3+ 要求开启
Settings > Languages & Frameworks > C/C++ > Modules > Enable C++20 modules support(勾选) - 首次加载 module 项目后,务必点击
File > Reload project from CMake,否则 IDE 不会重建 module graph
模块路径解析依赖 CXX_MODULE_PATH,不是传统 include_directories,这点极易被忽略。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











