如何在cmake中启用`/std:c++latest`?

14

我可以将CMAKE_CXX_STANDARD设置为17以获取/std:c++17,但我不能将其设置为latest,对吗? 我想我只能使用暴力方法来解决它

if (MSVC)
    add_compiler_options(/std:c++latest)
endif()

当然,但有没有习惯用法来获取/std:c++latest,甚至是与工具链无关的方式?

编辑 为什么有人想要这样做?与Clang和GCC不同,MSVC似乎没有定义/std:c++2a以启用C++17之后的功能。它仅使用/std:c++latest。如果我正在构建一个已知编译器集的代码库,则我知道可以使用哪些C++20功能,但我需要告诉构建系统启用每个编译器能够支持的所有内容。


我不知道有任何编译器(或工具链)提供这样的功能。大多数供应商都希望用户知道并故意选择他们构建的标准(并默认选择其支持稳定且近乎完整的标准)。由于最新版本通常是开发性和不稳定的,因此选择最新版本实际上是为了高度知识渊博且高级的开发人员,他们愿意并能够应对语言或库的不完整或不正确的实现。而那些开发人员可能会非常清楚地知道他们想要使用的标准版本。 - Peter
变量CMAKE_CXX_STANDARD实际上是唯一的“与工具链无关”的设置C++版本的方式。不幸的是,它只允许特定的预定义值。此外,据我所知,GCC和Clang都没有“最新”的标准选项。 - Some programmer dude
1
虽然我理解你想要这个功能的动机,但它会严重破坏给定代码库和 CMake 构建系统的可移植性。"最新版本" 的定义在不同编译器甚至编译器版本之间会有很大的差异。最好明确指出你想要哪个版本。 - Botje
@Someprogrammerdude 在为问题添加理由时,我意识到Clang和GCC只是使用了不同的方式来启用最新版本。对于这些编译器,您可以使用-std=c++1z-std=c++2a,它们将永久存在,并最终成为-std=c++17-std=c++20的别名。另一方面,/std:c++latest则是一个不断变化的目标。在C++20之后,它将变成GCC和Clang可能称之为-std=c++2b的东西。我认为我更喜欢GCC / Clang的方式,因为Botje和Peter在他们的评论中正确指出了原因。 - Marc Mutz - mmutz
3个回答

26

在 CMake 3.20.3 及之前的版本中,如果你通过 set(CMAKE_CXX_STANDARD 20) 请求 C++20,将会获得 -std:c++latest。证明:

  if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.12.25835)
    set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "-std:c++latest")
    set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "-std:c++latest")
  endif()

(来自cmake源代码中的Modules/Compiler/MSVC-CXX.cmake)

更新:自CMake 3.20.4以来,set(CMAKE_CXX_STANDARD 20)可以获得-std:c++20,因此您需要set(CMAKE_CXX_STANDARD 23)才能获得-std:c++latest - 假设您的MSVC编译器版本为16.11预览版1或更高版本(请参见cmake提交3aaf1d91bf353)。


4
假设您使用的编译器已经符合C++20标准,且不想采用之前回答中的“if”语句和额外赋值的方法,这是在使用Visual Studio或其他编译器时使用CMake放置最新版本C++的标准方式。
target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_20)

下面是 CMake 在 C++ 中支持的功能列表:CMAKE_CXX_KNOWN_FEATURES


-5
支持的值为98、11、14、17和20。
根据CMake文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接