【问题标题】:__cplusplus < 201402L return true in gcc even when I specified -std=c++14__cplusplus < 201402L 在 gcc 中返回 true,即使我指定了 -std=c++14
【发布时间】:2015-09-08 20:01:43
【问题描述】:

指令:

#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

我加了-std=c++14后还是会报错C++14 is required,不知道是什么原因。

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

【问题讨论】:

  • 一些编译器会将-std=c++14 视为启用任何已实现的C++ 14 功能的请求,而201402L 则暗示完全 支持该标准,所以它是不一定只是 GCC 的错误/错误。如果您想了解它在做什么,请阅读 GCC 文档......

标签: c++ gcc g++ c++14 predefined-macro


【解决方案1】:

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

__cplusplus 这个宏是在使用 C++ 编译器时定义的。您可以使用__cplusplus 来测试头文件是由C 编译器还是由C++ 编译器编译的。这个宏类似于__STDC_VERSION__,因为它扩展为一个版本号。根据选择的语言标准,宏的值为199711L,这是 1998 C++ 标准所要求的; 201103L,根据 2011 C++ 标准;对于-std=c++1y-std=gnu++1y 启用的实验语言,一个严格大于201103L 的未指定值

您可以检查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(尤其是Macros that describe C++14 features not supported)。

【讨论】:

  • 当文件的扩展名为.cpp 或使用编译器编译程序时,是否设置__cplusplus 宏。因为当我使用上述信息编写一个简单的程序并使用gcc而不是g++编译程序时,编译器会中止编译但基于#elif如果我不写#elif条件并使用gcc 编译程序它不会根据条件#ifndef __cplusplus 中止你能澄清一下实际发生的事情吗?代码参考:pastebin.com/iiuzPrwW
  • @strikersps __cplusplus 预处理器宏在编译单元使用 C++ 编译器编译时定义。从技术上讲,gccg++ 可用于具有适用选项设置的一般 C++ 开发。但是,g++ 默认行为自然与 C++ 开发保持一致。有关详细信息,请参阅stackoverflow.com/q/172587/3235496
猜你喜欢
  • 2014-11-23
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2015-05-03
  • 2019-12-15
  • 2017-10-03
相关资源
最近更新 更多