【发布时间】:2021-03-01 12:04:21
【问题描述】:
我可以将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 功能,但我需要告诉构建系统启用每个编译器能够执行的所有功能。
【问题讨论】:
-
我不知道有任何编译器(或工具链)提供了这样的功能。大多数供应商希望用户了解并有意选择他们构建的标准(并且默认为他们支持稳定且接近完整的标准)。由于最新版本通常是开发性和不稳定的,因此选择最新版本确实适合知识渊博的高级开发人员,他们愿意并且能够应对语言或库的不完整或不正确的实现。这些开发人员可能会确切地知道他们希望使用的标准版本。
-
变量
CMAKE_CXX_STANDARD实际上是设置要使用的 C++ 版本的唯一“工具链无关”方式。不幸的是,它只允许特定的预定义值。此外,GCC 和 Clang 都没有“最新”的标准选项 IIRC。 -
虽然我理解您想要此功能的动机,但它会严重破坏给定代码库和 CMake 构建系统的可移植性。 “最新”的定义将在不同的编译器甚至编译器版本之间发生显着变化。最好明确说明您想要哪个版本。
-
@Someprogrammerdude 为这个问题添加了理由,我意识到 Clang 和 GCC 只是使用不同的方式来启用最新的。对于那些编译器,你说
-std=c++1z或-std=c++2a,它们会永远存在,最终成为-std=c++17和-std=c++20的别名,分别。/std:c++latest,otoh,是一个移动的目标。在 C++20 之后,它将成为 GCC 和 Clang 可能会调用的-std=c++2b。我认为我更喜欢 GCC/Clang,因为 Botje 和 Peter 在他们的 cmets 中正确指出了原因。
标签: c++ visual-c++ cmake