4

指令:

#ifndef __cplusplus
  #error C++ is required
#elif __cplusplus < 201402L
  #error C++14 is required
#endif

命令行: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,我不知道为什么。

请告诉我如何解决这个问题。

4

1 回答 1

13

根据 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

对于clang++ --std=c++14

 Version    __cplusplus
  3.3          201305L
  3.4          201305L
  3.5.x        201402L
  3.6          201402L
  3.7          201402L

所以更安全的检查应该是:

#ifndef __cplusplus
#  error C++ is required
#elif __cplusplus <= 201103L
#  error C++14 is required
#endif

如评论中所述,这可能意味着部分 C++14 支持。

要检查特定功能,您还可以尝试Boost Config(尤其是描述不支持 C++14 功能的宏)。

于 2015-06-23T08:19:55.170 回答