我担心我已经知道答案,但我想确定......
我有一个相当大的项目,其头文件类型为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
格式字符串似乎令人生畏)。
答案 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.h
为printf
提供了可移植的宏。或者只使用C ++ I / O,然后您不必担心printf
格式。