c++如何在Qt中使用C++17/20 c++ QMake/CMake配置【技巧】

c++kquote>在 Qt 项目中启用 C++17/C++20 需通过 CMake(推荐)或 qmake 配置编译器标准,确保编译器版本匹配(如 MSVC 2019 16.10+、GCC ≥10、Clang ≥12),Qt 6.x 原生支持 C++17/20,Qt 5.15 仅实验性支持 C++20。

在 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 17) # 或 20
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_conceptscxx_modules(需编译器支持)等已有良好适配。

qmake 配置(传统 Qt 5 项目常用)

qmake 通过 QMAKE_CXXFLAGS 或更规范的 CONFIG 项启用新标准。

  • .pro 文件中添加(Qt 5.12+ 支持):
CONFIG += c++17 # 或 c++20(Qt 5.15+ / Qt 6.0+)
# 或显式指定(兼容旧版 qmake):
QMAKE_CXXFLAGS += -std=gnu++17

⚠️ 注意:使用 c++17(无下划线)是 qmake 内置 CONFIG 值,会自动适配不同编译器(如 MSVC 用 /std:c++17,GCC/Clang 用 -std=gnu++17)。避免混用 -std=c++17gnu++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 是一等公民,模块如 QMetaTypeQVariant 已适配 std::optionalstd::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+ 已优化性能。

不复杂但容易忽略。