繁体   English   中英

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

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

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

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

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

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

typedef上面用int (或int32_t / uint32_t从stdint.h),这将满足于我所知道的,但这似乎仍值得怀疑平台的32位大小。 printf样式函数也存在问题,其中使用了%ld (编译器抱怨并希望看到%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格式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM