

新闻资讯
技术学院在 Qt 项目中启用 C++17 或 C++20,关键在于正确配置构建系统(qmake 或 CMake),并确保编译器支持对应标准。Qt 本身不控制语言标准,而是由底层编译器(如 MSVC、Clang、GCC)决定是否支持及如何启用。
CMake 是 Qt 官方推荐的构建系统(尤其从 Qt 6 起),配置清晰且跨平台兼容性好。
这会让所有 target 自动继承该标准。若需为特定 target 单独设置(如仅对某个库启用 C++20):
target_compile_features(your_target PRIVATE cxx_std_20 cxx_concepts cxx_ranges)注意:target_compile_features 可检查特性可用性,比单纯设 -std 更安全;Qt 6.2+ 对 cxx_concepts、cxx_modules(需编译器支持)等已有良好适配。
qmake 通过 QMAKE_CXXFLAGS 或更规范的 CONFIG 项启用新标准。
⚠️ 注意:使用 c++17(无下划线
)是 qmake 内置 CONFIG 值,会自动适配不同编译器(如 MSVC 用 /std:c++17,GCC/Clang 用 -std=gnu++17)。避免混用 -std=c++17 和 gnu++17,后者默认启用扩展,可能影响可移植性。
若项目含多个 subdirs,可在根 .pro 中统一设置,子项目自动继承。
不是所有 Qt + 编译器组合都原生支持 C++20 特性:
-std=c++20 并自行验证稳定性;QMetaType、QVariant 已适配 std::optional、std::variant 等。启用新标准后,可直接使用现代语法,但要注意 Qt API 的衔接:
std::string_view 替代 const QString & 做只读参数(需 Qt 6.4+ 或自定义转换);QString::toStdString() 返回 std::string,配合 std::format(C++20)可简化日志格式化;auto 类型推导和 lambda 捕获,Qt 5.10+ 已优化性能。不复杂但容易忽略。