CMAKE_CXX_STANDARD

CMAKE_CXX_STANDARD 是指定所使用的 C++ 标准版本。

链接

CMAKE_CXX_STANDARED_REQUIRED

CMAKE_CXX_STANDARD_REQUIRED 表示使用 C++ 标准时,是否必须使用指定的版本。如果将其设置为 ON,则只有在可以使用所指定的 C++ 标准时,才会构建项目。如果将其设置为 OFF,则可以尝试使用较旧的 C++ 标准构建项目。

`CMAKE_CXX_STANDARD_REQUIRED` 是一个布尔值变量,用于指定是否强制使用 `CMAKE_CXX_STANDARD` 中设置的 C++ 版本。如果设置为 `ON`,那么 CMake 会要求编译器必须支持 `CMAKE_CXX_STANDARD` 中设置的 C++ 版本,否则会配置失败。如果设置为 `OFF` 或者未设置,那么如果编译器不支持 `CMAKE_CXX_STANDARD` 中设置的 C++ 版本,CMake 会回退到编译器支持的最新版本---链接

CMAKE_CXX_EXTENSIONS

什么是编译器扩展

编译器扩展是指 编译器提供的、超出 C/C++ 语法标准(ISO)的额外功能。例如:

  • GCC/Clang 扩展

    • __attribute__((packed))(强制结构体紧凑存储)

    • #include <bits/stdc++.h>(GCC 特有的万能头文件)

    • typeof(x)(GCC 的类型推断,标准 C++ 应使用 decltype(x)

  • MSVC 扩展

    • __declspec(dllexport)(Windows DLL 导出符号)

    • #pragma once(非标准但广泛支持的头文件保护)

什么是标准 C++(ISO C++)

  • 跨平台一致性:所有符合标准的编译器(GCC、Clang、MSVC 等)必须实现相同的语言特性。

  • 稳定演进:ISO 定期发布新标准(如 C++11、C++17、C++20),引入新特性但不随意破坏旧代码。

  • 标准库统一:提供 STL(如 vectorstring)、<algorithm> 等通用组件,行为在所有平台上一致。

所以每一个C++11、C++17、C++20版本就是一个编译器的标准。

为什么需要控制编译器扩展?

  • 可移植性:确保代码在其他编译器(如 MSVC)上也可以编译。

  • 标准合规性:某些项目(如嵌入式系统、安全关键代码)要求严格遵循 ISO 标准。

  • 确保代码在 GCC、Clang、MSVC 等不同编译器下行为一致。

cmake_cxx_extensions是CMake中的一个变量,用于设置编译器构建当前项目是否使用超出指定标准的,这个编译器可以提供的语法和功能。

set(CMAKE_CXX_EXTENSIONS OFF)----不能使用扩展语法和功能。

set(CMAKE_CXX_EXTENSIONS ON)----可以使用其他扩展语法和功能。

案例

# Set c++ standard
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON) #必须使用指定的c++20才能构建项目
set(CMAKE_CXX_EXTENSIONS OFF) #不支持编译器含有的,超出c++20的语法的其他扩展

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐