如何确定编译器使用的 C + + 标准的版本?

如何确定编译器实现了 C + + 标准的哪个版本?据我所知,以下是我所知道的标准:

  • C + + 03
  • C + + 98
216114 次浏览

快速搜索一下之后:

__STDC____STDC_VERSION__,参见 给你

据我所知,没有全面的方法可以做到这一点。如果你查看跨平台/多编译器支持库的头部,你总会发现定义的 很多使用编译器特定的结构来确定这些事情:

/*Define Microsoft Visual C++ .NET (32-bit) compiler */
#if (defined(_M_IX86) && defined(_MSC_VER) && (_MSC_VER >= 1300)
...
#endif


/*Define Borland 5.0 C++ (16-bit) compiler */
#if defined(__BORLANDC__) && !defined(__WIN32__)
...
#endif

对于您使用的所有编译器,您可能必须自己进行这样的定义。

取决于您想要实现的目标,启动,配置可能会对您有所帮助。它不提供标准版本的检测,但是它提供了宏,让您检查对特定语言/编译器特性的支持。

不,不,不,不,不,不,不

在 C + + 0x 中,宏 _ _ cplusplus 将被设置为与当前199711L 不同(大于)的值。

C + + 0x 常见问题解答

来自美国广播公司比雅尼·斯特劳斯特鲁普:

__cplusplus

在 C + + 11中,宏 __cplusplus将被设置为与当前 199711L不同(大于)的值。

虽然这没有你想象的那么有帮助。gcc(显然有将近10年的时间)将这个值设置为 1,排除了一个主要的编译器,直到 在 gcc4.7.0出来的时候就已经修好了

MSVC 也没有正确设置这个宏,直到今天。默认情况下,不管语言版本如何,它都定义为 199711L,并且您要么需要将 /Zc:__cplusplus添加到编译器标志中,要么检查一个 MSVC 特定的宏 _MSVC_LANG,它总是有正确的值。

这些是 C + + 标准,以及在 __cplusplus中应该能够期望得到什么价值:

  • C + + pre-C + + 98: __cplusplus1
  • C + + 98: __cplusplus199711L
  • C + + 98 + TR1: 读作 C + + 98,据我所知没有办法检查。
  • C + + 11: __cplusplus201103L
  • C + + 14: __cplusplus201402L
  • C + + 17: __cplusplus201703L
  • C + + 20: __cplusplus202002L

如果编译器可能是较旧的 gcc,我们需要求助于编译器特定的黑客技术(查看版本宏,将其与具有实现特性的表进行比较)或使用 启动,配置(提供 相关宏)。这样做的好处是,我们实际上可以挑选新标准的特定特性,并在缺少特性的情况下编写解决方案。这通常比整体解决方案更受欢迎,因为一些编译器声称实现了 C + + 11,但只提供了一部分特性。

Stdcxx Wiki 托管一个 用于编译器支持 C + + 0x 特性的综合矩阵(Archive.org 链接)(如果您敢于自己检查这些特性的话)。

不幸的是,更细粒度的特性检查(例如像 std::copy_if这样的单个库函数)只能在你的应用程序的构建系统中完成(用这个特性运行代码,检查它是否编译并产生了正确的结果——如果选择这条路线,autoconf是首选工具)。

请运行以下代码检查版本。

#include<iostream>


int main() {
if (__cplusplus == 201703L) std::cout << "C++17\n";
else if (__cplusplus == 201402L) std::cout << "C++14\n";
else if (__cplusplus == 201103L) std::cout << "C++11\n";
else if (__cplusplus == 199711L) std::cout << "C++98\n";
else std::cout << "pre-standard C++\n";
}

按建议使用 __cplusplus。 对于 Microsoft 编译器只有一个注意事项,使用 Zc:__cplusplus编译器开关启用 __cplusplus

来源 https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/

通常情况下,你应该使用 __cplusplus Definition 来检测 c + + 17,但是默认情况下,微软的编译器并没有正确地定义这个宏,参见 https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/-你需要修改项目设置来包含 /Zc:__cplusplus开关,或者你可以使用这样的语法:

#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
//C++17 specific stuff here
#endif

对于 cmake 项目可以使用:

if(MSVC)
target_compile_options(mytarget PUBLIC "/Zc:__cplusplus")
endif()

字体: https://peter-bloomfield-online.translate.goog/report-__cplusplus-correctly-with-cmake-and-visual-studio/?_x_tr_sl=en&_x_tr_tl=pt&_x_tr_hl=pt-BR&_x_tr_pto=sc