【问题标题】:Does <algorithm> define a macro X?<algorithm> 是否定义了宏 X?
【发布时间】:2017-05-27 13:56:25
【问题描述】:

我尝试使用选项 C++14 编译 the code

#define X static_cast<double>(2)
#include <algorithm>
// if you change the two lines, no error occurs

int main()
{
    return 0;
}

但是我在 X 之后得到错误:

错误:预期为 ',' 或 '...'

我没有得到选项 C++98 的错误。使用我的 gcc 版本 4.8.4,我没有收到错误,但使用 5.4.0 我会。这是一个错误吗?我是不是做错了什么?

【问题讨论】:

  • gcc6 没有错误
  • Can't reproduce 提供代码。至于 是否定义了宏,你可以查看文档——它没有。
  • 这就是我提供链接的原因。如果是错误,则链接的提供程序可能会使用受影响的版本。所以@DeiDei,这是一个错误,我做得很好吗?如果是这样,请回答以接受它。
  • g++ 5.1.0 同样的错误

标签: c++ algorithm gcc stl


【解决方案1】:

我在本地安装 g++ 5.4.0 时遇到同样的错误。我查看了g++ -E 输出,似乎错误追溯到 /usr/lib/gcc/x86_64-linux-gnu/5/include/ia32intrin.h 第 252 和 254 行:

/* Write flags register */
extern __inline void
__attribute__((__gnu_inline__, __always_inline__, __artificial__))
__writeeflags (unsigned long long X) // 252
{
  __builtin_ia32_writeeflags_u64 (X); // 254
}

这可以被认为是编译器捆绑库中的一个错误,因为非保留的#defines 不应该与它们发生冲突。 (同一头文件中的其他函数使用参数__X。)

【讨论】:

  • 这就是为什么预处理器是邪恶的。
  • 这是一个错误。由于这个问题,标准库不能使用任何标识符,除了保留的标识符。 Stephan T. Lavavej 曾经发表过一篇充满激情的独白,讲述了他们在 STL 实现中必须走的长度,以确保它在所有极端情况下都能正常工作(他们假设用户是邪恶的,并且会做标准允许的所有奇怪的事情;他们没有错) .用户定义的宏易于处理(只是不要使用 X 之类的名称);带有重载运算符的用户定义类型会带来更多痛苦。
  • 这提出了一个有趣的问题。有没有办法保护我的 own 标头免受此类用户定义的宏问题的影响?
  • 在 GCC 7.1 中由 gcc.gnu.org/r239617 修复,也将在 GCC 6.4 中修复
猜你喜欢
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
  • 2019-12-17
  • 2018-05-09
  • 1970-01-01
  • 2020-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多