如何确定编译器实现了 C + + 标准的哪个版本?据我所知,以下是我所知道的标准:
快速搜索一下之后:
__STDC__和 __STDC_VERSION__,参见 给你
__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 将被设置为与当前199711L 不同(大于)的值。
C + + 0x 常见问题解答
来自美国广播公司比雅尼·斯特劳斯特鲁普:
__cplusplus 在 C + + 11中,宏 __cplusplus将被设置为与当前 199711L不同(大于)的值。
__cplusplus
在 C + + 11中,宏 __cplusplus将被设置为与当前 199711L不同(大于)的值。
199711L
虽然这没有你想象的那么有帮助。gcc(显然有将近10年的时间)将这个值设置为 1,排除了一个主要的编译器,直到 在 gcc4.7.0出来的时候就已经修好了。
gcc
1
MSVC 也没有正确设置这个宏,直到今天。默认情况下,不管语言版本如何,它都定义为 199711L,并且您要么需要将 /Zc:__cplusplus添加到编译器标志中,要么检查一个 MSVC 特定的宏 _MSVC_LANG,它总是有正确的值。
/Zc:__cplusplus
_MSVC_LANG
这些是 C + + 标准,以及在 __cplusplus中应该能够期望得到什么价值:
201103L
201402L
201703L
202002L
如果编译器可能是较旧的 gcc,我们需要求助于编译器特定的黑客技术(查看版本宏,将其与具有实现特性的表进行比较)或使用 启动,配置(提供 相关宏)。这样做的好处是,我们实际上可以挑选新标准的特定特性,并在缺少特性的情况下编写解决方案。这通常比整体解决方案更受欢迎,因为一些编译器声称实现了 C + + 11,但只提供了一部分特性。
Stdcxx Wiki 托管一个 用于编译器支持 C + + 0x 特性的综合矩阵(Archive.org 链接)(如果您敢于自己检查这些特性的话)。
不幸的是,更细粒度的特性检查(例如像 std::copy_if这样的单个库函数)只能在你的应用程序的构建系统中完成(用这个特性运行代码,检查它是否编译并产生了正确的结果——如果选择这条路线,autoconf是首选工具)。
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
Zc:__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