你如何处理在平台之间切换的整数的原生大小?

时间:2011-08-30 21:20:35

标签: c++ c portability

我担心我已经知道答案,但我想确定......

我有一个相当大的项目,其头文件类型为typedefs native types:

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

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

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

这看起来很简单但我想在开始深入研究之前确定(修复%d格式字符串似乎令人生畏)。

3 个答案:

答案 0 :(得分:6)

C有<stdint.h>,在C ++ 0x中为<cstdint>。对于非C ++ 0x编译器,如果您不介意依赖Boost,则需要<boost/cstdint.hpp><inttypes.h>标头还包含printf()格式说明符的宏,可以是adapted for use类型的{{3}}。如果您正在使用C ++,那么您应该使用<cstdint>,因此无需担心类型化格式说明符。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

关于便携式32位整数(等)的解决方案:

  • 在一些手工构建的配置文件或
  • 中定义您自己的可移植类型
  • 使用stdint.h为您执行此操作,并保证在任何甚至接近C99兼容的C编译器中都存在。

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