我无法为 g++ 的 _cplusplus 宏打印值 201703L

Posted

技术标签:

【中文标题】我无法为 g++ 的 _cplusplus 宏打印值 201703L【英文标题】:I am unable to print out the value 201703L for _cplusplus macro for g++ 【发布时间】:2020-08-27 14:50:48 【问题描述】:

我正在尝试让我的编译器使用 c++ 版本 17。这是我用来检查我是否可以使用 c++17 和我的 g++ 编译器进行编译的代码 sn-p。

#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"; //g++ -std=c++11 check_cpp_version.cpp
    else if (__cplusplus == 199711L) std::cout << "C++98\n"; //g++ check_cpp_version.cpp
    else std::cout << "pre-standard C++\n";

另外,下面是以下命令的输出 -

storm@storm:~$ g++ -v --help | grep "std"
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper
Target: x86_64-linux-gnu
:
:
-std=c++17            This switch lacks documentation
-std=c++1y            Deprecated in favor of -std=c++14
-std=c++1z            Conform to the ISO 2017(?) C++ draft standard (experimental and incomplete support)
:
:

带有编译器语法的程序输出

storm@storm:~$ g++ -std=c++1z check_cpp_version.cpp -o check_cpp_version
storm@storm:~$ ./check_cpp_version
storm@storm:~$ pre-standard C++
storm@storm:~$ g++ -std=c++17 check_cpp_version.cpp -o check_cpp_version
storm@storm:~$ ./check_cpp_version
storm@storm:~$ pre-standard C++

这两种情况我都无法打印出“C++17”。

谁能指导我如何完成这件事?它是否需要更新编译器(即使它有 -std=c++17 开关)或其他一些包更新,或者我应该完全转向不同的编译器?

================================================ ========================== 更新此问题

我需要做的就是更新我使用此链接所做的 gcc/g++ 编译器 - https://gist.github.com/jlblancoc/99521194aba975286c80f93e47966dc5

您可以关注cmets并回答这个问题以获得理解。

================================================ ==========================

【问题讨论】:

std::cout &lt;&lt; __cplusplus 说什么? 您使用的是什么版本的编译器? “此开关缺少文档”让我认为您使用的版本没有完整的 C++17 支持。 @eerorika 它打印出 201500 @ThomasJager gcc 版本 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) “符合 ISO 2017(?) C++ 草案标准(实验性和不完整的支持)”。您的编译器太旧了,甚至无法确定在构建时是否会有 2017 年标准。 【参考方案1】:

您引用的输出中的重要部分:

符合 ISO 2017(?) C++ 草案标准(实验性和不完整的支持

您使用的编译器不完全支持 C++17。该编译器于 2015 年发布,早于 C++17 最终定稿。

[__cplusplus] 打印出 201500

在这种情况下,__cplusplus == 201703L 将不成立。

您需要使用支持 C++17 的较新编译器。在撰写本文时,GCC 的最新版本是 10.2。我推荐这个版本。

【讨论】:

以上是关于我无法为 g++ 的 _cplusplus 宏打印值 201703L的主要内容,如果未能解决你的问题,请参考以下文章

#ifdef __cplusplus 的用法(C语言调用c++代码)

#ifdef __cplusplus+extern "C"的用法

#ifdef __cplusplus extern “C“{ #endif的作用

常见的编译器内置宏

002:带参宏调试

带有 CMake 的 QtCreator,在编辑器中错误地解析了 __cplusplus 值