我无法为 g++ 打印出 _cplusplus 宏的值 201703L
I am unable to print out the value 201703L for _cplusplus macro for g++
我正在尝试让我的编译器使用 c++ 版本 17。这是我用来检查我是否可以使用 c++17 和我的 g++ 编译器进行编译的代码片段。
#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++ 编译器,我使用这个 link -
https://gist.github.com/jlblancoc/99521194aba975286c80f93e47966dc5
您可以关注评论并回答此问题以了解情况。
============================================= ===========================
您引用的输出中的重要部分:
Conform to the ISO 2017(?) C++ draft standard (experimental and incomplete support)
您使用的编译器不完全支持 C++17。该编译器于 2015 年发布,远早于 C++17 最终确定。
[__cplusplus
] prints out 201500
那样的话__cplusplus == 201703L
就不成立了。
您需要使用支持 C++17 的更新编译器。在撰写本文时,GCC 的最新版本是 10.2。我推荐这个版本。
我正在尝试让我的编译器使用 c++ 版本 17。这是我用来检查我是否可以使用 c++17 和我的 g++ 编译器进行编译的代码片段。
#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++ 编译器,我使用这个 link - https://gist.github.com/jlblancoc/99521194aba975286c80f93e47966dc5
您可以关注评论并回答此问题以了解情况。
============================================= ===========================
您引用的输出中的重要部分:
Conform to the ISO 2017(?) C++ draft standard (experimental and incomplete support)
您使用的编译器不完全支持 C++17。该编译器于 2015 年发布,远早于 C++17 最终确定。
[
__cplusplus
] prints out 201500
那样的话__cplusplus == 201703L
就不成立了。
您需要使用支持 C++17 的更新编译器。在撰写本文时,GCC 的最新版本是 10.2。我推荐这个版本。