【问题标题】:stdint.h not compatible with C++?stdint.h 与 C++ 不兼容?
【发布时间】:2014-10-07 12:42:05
【问题描述】:

我尝试编译一个源代码包,发现了特定于版本的问题。

当我在计算机上执行此操作时,一切顺利;但是当我在另一台计算机上编译它时,它会产生很多未定义 INT32_MAX 的声明。两台电脑都运行 Debian 系统,不同的是我的电脑使用的是 Testing repo 并且有 gcc 4.9,而另一台电脑使用的是 Stable repo.,它的 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 允许?

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

【问题讨论】:

  • 如果包含<cstdint>,你会得到同样的结果吗?
  • std::numeric_limits.
  • 您需要在包含stdint.h 之前定义一些像__STDC_CONSTANT_MACROS 这样的宏,以便在C++ 11 之前的C++ 中获得您想要的定义,请参阅C99 标准。

标签: c++ c macros compatibility glibc


【解决方案1】:

在 C++ 中,建议您使用 std::numeric_limits #include <limits>:

来自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;
}

【讨论】:

  • 这些“特征”是通过类模板和静态成员函数实现的。与宏实现相比,会不会导致实际的运行时函数调用?
  • 在编译时优化为常量值
【解决方案2】:

包括包含整数类型大小的 climits 或 limits.h。此头文件定义了常量,并限制了特定系统和所使用的编译器实现的基本整数类型。基本浮点类型的限制在 cfloat(之前的 float.h)中定义。特定宽度的整数类型和其他 typedef 类型的限制在 cstdint(早期的 stdint.h)中定义。

你应该包含 cstdint 而不是 stdint.h

【讨论】:

  • cstdint 在 C++11 之前不可用
猜你喜欢
  • 2015-10-15
  • 1970-01-01
  • 2018-07-04
  • 2015-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
相关资源
最近更新 更多