
在 Qt 项目中启用 C++17 或 C++20,关键在于正确配置构建系统(qmake 或 CMake),并确保编译器支持对应标准。Qt 本身不控制语言标准,而是由底层编译器(如 MSVC、Clang、GCC)决定是否支持及如何启用。
CMake 配置(推荐方式)
CMake 是 Qt 官方推荐的构建系统(尤其从 Qt 6 起),配置清晰且跨平台兼容性好。
- 在 CMakeLists.txt 中设置 C++ 标准(Qt 5.15+ / Qt 6.x 均适用):
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF) # 禁用 GNU 扩展,保证标准合规
这会让所有 target 自动继承该标准。若需为特定 target 单独设置(如仅对某个库启用 C++20):
target_compile_features(your_target PRIVATE cxx_std_20 cxx_concepts cxx_ranges)target_compile_options(your_target PRIVATE -std=c++20)
注意:target_compile_features 可检查特性可用性,比单纯设 -std 更安全;Qt 6.2+ 对 cxx_concepts、cxx_modules(需编译器支持)等已有良好适配。
立即学习“C++免费学习笔记(深入)”;
qmake 配置(传统 Qt 5 项目常用)
qmake 通过 QMAKE_CXXFLAGS 或更规范的 CONFIG 项启用新标准。
- 在 .pro 文件中添加(Qt 5.12+ 支持):
# 或显式指定(兼容旧版 qmake):
QMAKE_CXXFLAGS += -std=gnu++17
⚠️ 注意:使用 c++17(无下划线)是 qmake 内置 CONFIG 值,会自动适配不同编译器(如 MSVC 用 /std:c++17,GCC/Clang 用 -std=gnu++17)。避免混用 -std=c++17 和 gnu++17,后者默认启用扩展,可能影响可移植性。
若项目含多个 subdirs,可在根 .pro 中统一设置,子项目自动继承。
编译器与 Qt 版本匹配要点
不是所有 Qt + 编译器组合都原生支持 C++20 特性:
- MSVC:Visual Studio 2019 16.10+ 支持大部分 C++20;Qt 6.2+ 官方构建默认启用 C++17;
- GCC:建议 ≥ 10(C++20 部分特性)或 ≥ 11(较完整);Qt 官方 Linux 包通常基于 GCC 10+;
- Clang:≥ 12 对 C++20 支持较好;macOS Xcode 13+(Clang 13)可放心用 C++20;
-
Qt 5.15 LTS:官方支持 C++17,C++20 属实验性,需手动加
-std=c++20并自行验证稳定性; -
Qt 6.x:从设计上以 C++17 为基线,C++20 是一等公民,模块如
QMetaType、QVariant已适配std::optional、std::variant等。
实际编码与 Qt 兼容提示
启用新标准后,可直接使用现代语法,但要注意 Qt API 的衔接:
- 用
std::string_view替代const QString &做只读参数(需 Qt 6.4+ 或自定义转换); - Qt 6 中
QString::toStdString()返回std::string,配合std::format(C++20)可简化日志格式化; - 慎用 C++20 modules:目前 Qt 尚未提供 module 接口(.mxx),仍依赖传统头文件包含;
- 信号槽连接支持 C++17
auto类型推导和 lambda 捕获,Qt 5.10+ 已优化性能。
不复杂但容易忽略。











