【问题标题】:How to find default supported C++ standard by g++ compiler in cmake如何在 cmake 中通过 g++ 编译器查找默认支持的 C++ 标准
【发布时间】:2025-11-26 18:35:01
【问题描述】:

我看到了很多关于如何启用某些 C++ 标准的线程,例如

add_definitions("-std=c++14")

set (CMAKE_CXX_STANDARD 11)

但是如何在编译代码时找到默认的 g++ 编译器遵循哪个标准?

【问题讨论】:

  • 让 cmake 使用编译器来尝试编译一个使用 C++ 的小程序——某些版本只有功能。
  • 或者检查编译器的版本并将其与支持某些 C++ 标准版本的编译器的已知版本相匹配

标签: c++ ubuntu cmake


【解决方案1】:

add_definitions("-std=c++14") 不是启用 C++14 的正确方法。正确的方法是您提到的第二个:set(CMAKE_CXX_STANDARD 14),或set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")

add_definitions 用于宏定义,相当于源代码中的#define

关于您的问题,在编译器中依赖 C++ 的默认版本是一种不好的做法。甚至 Visual Studio 现在都定义了你要使用的标准,这在 VS 中是一个新事物。 通过指定标准来制定标准来解决这个问题。因此,在您的项目中,您定义目标标准,然后在您的 make 文件中定义它。您不应期望您的代码适用于所有 C++ 标准。

【讨论】:

  • 请教我粒子物理学
  • @The Quantum,感谢您提供非常有用的答案,我的问题是,如果我不设置编译器标准标志(接受不良做法),默认情况下遵循哪个标准 g++?这个怎么找。一个是太使用文档,但我想做运行时。
  • @SombreroChicken 查看我的 Stack Exchange Physics 帐户。
  • @TonyParker 我不知道如何做到这一点。我不认为这是可能的。有一种解决方法,但它会破坏交叉编译的可能性。您创建一个小程序,使用告诉您 C++ 版本的宏,然后打印它们,并在编译目标程序时在 cmake 中解析它们。
  • ... 使用的宏是__cplusplus。对于可能的值(到目前为止!),请参阅en.cppreference.com/w/cpp/preprocessor/…
【解决方案2】:

如果您正在开发应用程序,则不应根据可用的编译器版本调整代码,而应指定代码需要的编译器标准

set (CMAKE_CXX_STANDARD 11)

如果您要构建一个旨在用于不同上下文的代码,请使用编译器feature detection 和条件编译。例如:

write_compiler_detection_header(
  FILE "${CMAKE_CURRENT_BINARY_DIR}/compiler_features.h"
  PREFIX Foo
  COMPILERS GNU
  FEATURES
    cxx_variadic_templates
)

然后:

#include "compiler_features.h"
#if Foo_COMPILER_CXX_VARIADIC_TEMPLATES
#  include "with_variadics/interface.h"
#else
#  include "no_variadics/interface.h"
#endif

这对于像 MSVC 这样的编译器特别有用,这些编译器具有 C++17 的许多特性,同时也缺少 C++11 的一些基本特性(例如表达式 SFINAE)。

CMake 为许多流行的 C++ 功能内置了 detectors


PS。如果你真的很好奇,G++ 到 5.0 默认使用 gnu++98 标准,从 6.0 开始使用 gnu++14(GNU 方言 -std=c++14)。

【讨论】: