平台格式没有警告
这个问题在这里已经有了答案:
对于size_t
,假设您有足够现代的C库,请使用%zu
。
如果您不能使用z
修饰符(某些较旧的库不幸地不支持它),请在打印时将其转换为足够宽的已知类型,然后使用适合该类型的宽度说明符:
size_t sz = sizeof(whatever);
...
printf("%lu", (unsigned long)sz);
只要你从来没有使用过大于40亿的大小,即可以容纳32位的数据,它就可以工作。 如果你在size_t
为64位但long
为32的系统上,理论上你已经知道size_t
可以容纳的大小,但%lu
不能打印。 对于你来说这是否是一个问题,如果是这样,该怎么办,取决于你。 (如果你的库支持它,理想的解决方案是返回到%zu
,这是首选的解决方案,并且在32位,64位或任何其他大小的环境中都没有这个问题。或者我猜你可以使用unsigned long long
和%llu
。)
通过使用显式大小的整数而不是本地数据类型,可以避免此特定警告。
#include <cstdint>
int8_t a = 15; //usually an alias for char
uint16_t b = 4980; //usually an alias for unsigned short
uint32_t c = 1234567890; //usually an alias for unsigned int or unsigned long
int64_t d = 908070605040302010ll; //usually an alias for long long
具有大小整数的技巧是,例如,如果一个平台上的long
为32位,而另一个平台上的long
为64位,则long
任何用法都是不可移植的。 但是int64_t
将始终为64位,否则它在给定平台上将不存在。
具体来说,你的代码似乎假设size_t
将始终为64位,但不能保证。 所以你应该使用uint64_t
来代替它,它保证了它最终使用的任何底层数据类型,它将是64位(和unsigned,这是size_t
唯一的保证)。
上一篇: platform format without warnings
下一篇: Portable printf format specifier for 64 bit hexadecimal?