【发布时间】:2011-08-31 05:30:30
【问题描述】:
恐怕我已经知道这个问题的答案,但我想确定......
我有一个相当大的项目,其中包含一个对原生类型进行 typedef 的头文件:
typedef unsigned long int u32;
typedef signed long int s32;
// etc...
不可避免的事情已经发生,我现在尝试在long 是 64 位而不是 32 位的系统上进行编译。修复它的最佳方法是什么?
我可以用int(或来自stdint.h的int32_t/uint32_t)在上面typedef,这将满足我所知道的平台上的32位大小,但这似乎仍然值得怀疑。使用%ld 的printf 样式函数也存在问题(编译器抱怨并希望看到%d)。这些都必须改变,不是吗(也许在 inttypes.h 中有定义)?
这看起来很简单,但在我开始深入研究之前我想确定一下(修复printf 格式字符串似乎令人生畏)。
【问题讨论】:
-
什么时候真正重要?为什么不能只使用
unsigned int?这是便携式的,只是大小无法预测。 -
当您将非
long传递给%ld时,您的编译器应该给出警告,并且使用标志您应该能够将该警告变为错误。这让您有机会解决所有问题。 -
@Dietrich:这对于大多数简单情况来说都很好,在这些情况下,您的格式字符串是对
printf的调用中的文字。当格式字符串来自其他地方(例如一组本地化字符串)时,编译器无济于事。这就是为什么在此类本地化字符串中仅使用%s并在涉及特定于语言的代码之前将数字转换为字符串或使用比可变参数更安全的东西是一个好主意的原因之一。但是,如果您已经以另一种方式完成了它,那么改变它是一项工作。所以你说的值得去做,但并不能解决所有问题。 -
@Steve Jessop:公平,但您通常可以定义一个宏来将本地化字符串作为文字传递,其余情况相对较少。
标签: c++ c portability