DMa*_*ter 2 c++ gcc g++ predefined-macro c++14
指令:
#ifndef __cplusplus
#error C++ is required
#elif __cplusplus < 201402L
#error C++14 is required
#endif
Run Code Online (Sandbox Code Playgroud)
命令行: g++ -Wall -Wextra -std=c++14 -c -o header.o header.hpp
我的g ++版本: g++ (tdm-1) 4.9.2
C++14 is required即使我添加了错误也会生成-std=c++14,我不知道为什么.
请告诉我如何解决这个问题.
man*_*lio 10
__cplusplus在使用C++编译器时定义此宏.您可以使用它__cplusplus来测试标头是由C编译器还是C++编译器编译.此宏类似于__STDC_VERSION__,它扩展为版本号.根据所选择的语言标准,宏的值是199711L1998 C++标准规定的;201103L,根据2011 C++标准; 一个未指定的值,严格地大于201103L-std=c++1y和启用的实验语言-std=gnu++1y.
您可以检查g++ --std=c++14定义__cplusplus为:
Version __cplusplus
4.8.3 201300L
4.9.2 201300L
5.1.0 201402L
Run Code Online (Sandbox Code Playgroud)
用于clang++ --std=c++14:
Version __cplusplus
3.3 201305L
3.4 201305L
3.5.x 201402L
3.6 201402L
3.7 201402L
Run Code Online (Sandbox Code Playgroud)
所以更安全的检查应该是:
#ifndef __cplusplus
# error C++ is required
#elif __cplusplus <= 201103L
# error C++14 is required
#endif
Run Code Online (Sandbox Code Playgroud)
正如评论中所指出的,这可能意味着部分C++ 14支持.
要检查特定功能,您还可以尝试Boost Config(特别是描述不支持C++ 14功能的宏).