如何处理平台之间整数的本地大小变化

How do you deal with the native size of integers changing between platforms?

本文关键字:变化 整数 之间 何处理 处理 平台      更新时间:2023-10-16

恐怕我已经知道答案了,但我想确定。。。

我有一个相当大的项目,有一个头文件,可以对原生类型进行类型定义:

typedef unsigned long int    u32;
typedef signed long int      s32;
// etc...

不可避免的事情已经发生了,我现在正试图在long是64位而不是32位的系统上进行编译。修复它的最佳方法是什么?

我可以用int(或stdint.h中的int32_t/uint32_t(来typedef,这将满足我所知道的平台上的32位大小,但这似乎仍然是可疑的。使用%ldprintf样式函数也存在问题(编译器抱怨并希望看到%d(。这些都必须更改,不是吗(也许在inttypes.h中有定义(?

这看起来很简单,但在开始深入研究之前,我想先确定一下(修复printf格式的字符串似乎很难(。

C有<stdint.h>,在C++0x中是<cstdint>。对于非C++0x编译器,如果您不介意依赖Boost,那么您有<boost/cstdint.hpp><inttypes.h>报头还包括用于printf()格式说明符的宏,其可适用于与<cstdint>类型一起使用。如果您使用的是C++,那么您应该使用<iostream>,因此不需要担心类型化的格式说明符。

创建一个与库/可执行文件一起编译的单个翻译(.cpp(。在其中,使用静态断言。如果您需要特定的大小,这种方法可以在创建可链接/可执行二进制文件之前确认您的声明是否符合您需要它们匹配的条件(如果环境发生变化(。

然后打开编译器警告并修复必须修复的内容。

关于可移植32位整数(等等(的解决方案:

  • 在一些手工构建的配置文件或
  • 使用stdint.h,它可以为您做到这一点,并且保证在任何与C99兼容的C编译器中都存在

printf而言,stdint.hprintf提供了可移植的宏。或者只需使用C++I/O,就不必担心printf格式。