[英]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.h
为printf
提供了可移植的宏。 或者只使用C ++ I / O,然后您不必担心printf
格式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.