CMAKE_<LANG>_STANDARD_LATEST

在版本 3.30 中添加。

此变量表示当前编译器支持的语言 <LANG> 的最新标准版本与 CMake 支持的最新版本之间的最小值。它的值将被设置为对应的 <LANG>_STANDARD 目标属性支持的值之一;请参阅该属性的文档以获取支持的语言列表。

请参阅 cmake-compile-features(7) 手册,以获取有关编译特性的信息和支持的编译器列表。

注意

CMAKE_<LANG>_STANDARD_LATEST 永远不会设置为 CMake 识别但不支持的语言标准。除非另有明确说明,否则对应的 <LANG>_STANDARD 目标属性支持的每个值都表示 CMake 识别和支持的语言 <LANG> 的标准。

检查语言标准支持

可以使用 CMAKE_<LANG>_STANDARD_LATEST 变量的值来检查语言标准支持。这可以用于,例如,有条件地为分布式库启用可选功能。

这样做时,应注意 **不要** 依赖于标准级别之间的整数值比较。这是因为 CMake 支持的给定语言的一些较旧标准(例如,C++98,表示为 98)将具有比同一语言的较新标准更高的数值。

以下代码示例演示了如何正确检查 C++17 支持

# Careful! We cannot do direct integer comparisons with
# CMAKE_CXX_STANDARD_LATEST because some earlier C++ standards (e.g.,
# C++98) will have a higher numerical value than our requirement (C++17).
#
# Instead, we keep a list of unsupported C++ standards and check if
# CMAKE_CXX_STANDARD_LATEST appears in that list.
set(UNSUPPORTED_CXX_STANDARDS
  98
  11
  14
)

list(FIND UNSUPPORTED_CXX_STANDARDS ${CMAKE_CXX_STANDARD_LATEST} UNSUPPORTED_CXX_STANDARDS_INDEX)

if(UNSUPPORTED_CXX_STANDARDS_INDEX EQUAL -1)
  # We know that the current compiler supports at least C++17. Enabling
  # some optional feature...
else()
  message(STATUS
    "Feature X is disabled because it requires C++17, but the current "
    "compiler only supports C++${CMAKE_CXX_STANDARD_LATEST}."
  )
endif()