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