__cplusplus <201402L即使我指定-std = c ++ 14,也会在gcc中返回true

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

根据GCC CPP手册(版本4.9.25.1.0):

__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功能的宏).

  • @strikersps 如果编译单元是用 C++ 编译器编译的,则定义 `__cplusplus` 预处理器宏。从技术上讲,“gcc”或“g++”都可以通过适用的选项设置用于一般 C++ 开发。然而,“g++”默认行为自然地与 C++ 开发保持一致。有关更多详细信息,请参阅 /sf/ask/12081121/。 (2认同)