2014-10-07 124 views
0

我试图编译一个源代码包,并发现特定于版本的问题。stdint.h与C++不兼容?

当我在电脑上这样做时,一切都很顺利;但是当我在另一台计算机上编译它时,它会产生很多声明INT32_MAX未定义。这两台电脑都运行Debian系统,不同之处在于我的电脑使用了测试回购并且具有gcc 4.9,而另一台电脑使用了稳定的回购,它具有稍微老一点的gcc 4.7。

然后我详细看/usr/include/stdint.h里面。通过惊奇的是,计算机声称未定义宏上,所有INT范围宏非C++条件中定义:

/** 
* I forget the exact definition, 
* but it looks like this: 
*/ 
#ifndef __cplusplus ...... 
...... 
# define INT32_MIN XXX 
# define INT32_MAX XXX 
...... 
#endif 

作为结果,包将不会看到这些标准范围宏,因为它是一个C++项目,并使用g ++进行编译。

为什么gcc 4.7的stdint.h是这样设计的?这是否意味着gcc 4.7不希望我在C++中使用这些整数范围,并且gcc 4.9允许它?

而最重要的是:我该如何解决这个问题?

+3

你会得到相同的如果你包含''? – rubenvb 2014-10-07 12:43:19

+3

'std :: numeric_limits'。 – 2014-10-07 12:45:42

+1

在包含'stdint.h'之前,您需要定义一些宏,比如'__STDC_CONSTANT_MACROS',以在C++ 11之前获取C++所需的定义,请参阅C99标准。 – 2014-10-07 12:52:50

回答

4

在C:

使用例如从cplusplus.com

// numeric_limits example 
#include <iostream>  // std::cout 
#include <limits>  // std::numeric_limits 

int main() { 
    std::cout << std::boolalpha; 
    std::cout << "Minimum value for int: " << std::numeric_limits<int>::min() << '\n'; 
    std::cout << "Maximum value for int: " << std::numeric_limits<int>::max() << '\n'; 
    std::cout << "int is signed: " << std::numeric_limits<int>::is_signed << '\n'; 
    std::cout << "Non-sign bits in int: " << std::numeric_limits<int>::digits << '\n'; 
    std::cout << "int has infinity: " << std::numeric_limits<int>::has_infinity << '\n'; 
    return 0; 
} 
+0

这些“特征”是通过类模板和静态成员函数实现的。与宏实现相比,它会导致实际的运行时函数调用吗? – jiandingzhe 2014-10-08 06:09:07

+0

在编译时将其优化为常量值 – Baldrickk 2014-10-08 06:59:23

0

包含包含积分类型大小的爬升或limits.h。这个头文件定义了具有所使用的特定系统和编译器实现的基本整型类型限制的常量。基本浮点类型的限制在cfloat(早期的float.h)中定义。宽度专用整型和其他typedef类型的限制在cstdint(早期的stdint.h)中定义。

您应该包括cstdint而不是stdint.h ++你推荐使用std :: numeric_limits #include <limits>

+0

'cstdint'在C++之前不可用11 – jiandingzhe 2014-10-08 06:06:44