g ++ 4.9.4缺少LLONG_MAX?

时间:2017-11-03 17:07:22

标签: c++ c++11 g++

我试图调试这个简单的代码:

#include "limits.h"

int main()
{
  long long a = LLONG_MAX;

  return 0;
}

如果我像

那样运行它
g++ test.cpp

我得到了

test.cpp: In function ‘main’:
test.cpp:5:17: error: ‘LLONG_MAX’ undeclared (first use in this function)
long long a = LLONG_MAX;

我检查了这个常量的引用,它说:

  为库定义了

LLONG_MINLLONG_MAXULLONG_MAX   符合1999年或以后的C标准(仅包括   自2011年以来的C ++标准:C ++ 11)。

所以我尝试设置-std=c++11,但没有帮助。有什么建议吗?

P.S使用g ++ 5.4.0在其他机器上编译相同的代码

更新:LONG_MAX可见(但LLONG_MAX不是),机器是debian4

2 个答案:

答案 0 :(得分:4)

Debian 4非常陈旧,并附带一个不能正确支持C99的glibc版本。即使您安装了较新的GCC版本,您仍然需要安装更新的glibc版本。这在Debian 4上可能是不可能的。

glibc是Debian和大多数其他Linux发行版上的标准C库实现。

如果你想使用更现代的C功能,你应该使用更现代的Debian版本。

您仍然可以在编译时尝试启用GNU扩展,希望您正在处理的glibc版本在GNU模式下公开更多C99功能:

g++ -std=gnu++11 test.cpp

同时在系统标题中搜索LLONG_MAX

grep -r LLONG_MAX /usr/include

如果这是空的,那么你无能为力。如果找到了某些内容,那么请尝试查看哪个宏LLONG_MAX受到保护,以及是否需要在编译器标志中定义该宏(使用-D选项)。

也尝试使用"适当的"正如tpr在他/她的回答中所建议的那样,C ++为此起作用。如果std::numeric_limits有效,请使用它。

如果这些都不起作用,那么你真的只有两个选择。找到一种方法来升级glibc而不需要对系统进行整理,或者升级到更新的Debian版本。

答案 1 :(得分:2)

在C ++中,您应该使用std::numeric_limits

#include <limits>
...
std::numeric_limits<long long>().max();

如果您想要c定义,请使用#include <climits>