包括<algorithm>和<limits>导致&#34;无效的纯指示符&#34;编译错误

时间:2016-02-21 09:33:41

标签: c++

鉴于此代码:

#include <algorithm>
#include <limits>

int main() {
    const char INFINITY = std::numeric_limits<char>::max();

    return 0;
}

如果我用g++编译它,我会收到以下错误:

$ g++ --std=c++11 test.cpp

test.cpp: In function ‘int main()’:
test.cpp:5:30: error: invalid pure specifier (only ‘= 0’ is allowed) before ‘::’ token
     const char INFINITY = std::numeric_limits<char>::max();
                              ^
test.cpp:5:58: error: function ‘const char __builtin_inff()’ is initialized like a variable
     const char INFINITY = std::numeric_limits<char>::max();

删除#include <algorithm>语句可以解决问题。

我的问题:这是一个错误还是预期的行为?

如果这是预期的行为,是否有一些我不知道的命名空间冲突规则?

g ++版本:

gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.1)

1 个答案:

答案 0 :(得分:4)

INFINITY是由<limits>(或C limits.h)中的C和C ++标准定义的宏 - 它表示double的无穷大值(例如0x7ff0000000000000)对于IEEE-754)。通常,这被定义为编译器在代码生成的后期阶段替换为常量的“内置函数”。因此相当奇怪的错误信息。由于宏只是在没有名称空间等的情况下就地扩展,因此不可能将名称INFINITY用于其他任何内容。