我有以下
size_t i = 0;
uint32_t k = 0;
printf("i [ %lu ] k [ %u ]\n", i, k);
编译时收到以下警告:
format ‘%lu’ expects type ‘long unsigned int’, but argument has type ‘uint32_t’
当我使用夹板运行时,我得到以下内容:
Format argument 1 to printf (%u) expects unsigned int gets size_t: k
非常感谢任何建议,
答案 0 :(得分:125)
尝试
#include <inttypes.h>
...
printf("i [ %zu ] k [ %"PRIu32" ]\n", i, k);
z
表示长度与size_t
相同的整数,PRIu32
宏defined in the C99 header inttypes.h
表示无符号的32位整数。
答案 1 :(得分:23)
所需要的只是格式说明符和类型一致,你总是可以强制转换为真。 long
至少为32位,因此%lu
和(unsigned long)k
始终是正确的:
uint32_t k;
printf("%lu\n", (unsigned long)k);
size_t
比较棘手,这就是在C99中添加%zu
的原因。如果你不能使用它,那就像k
一样对待它(long
是C89中最大的类型,size_t
不太可能更大)。
size_t sz;
printf("%zu\n", sz); /* C99 version */
printf("%lu\n", (unsigned long)sz); /* common C89 version */
如果没有为您传递的类型提供正确的格式说明符,那么printf
将相当于从数组中读取太多或太少的内存。只要您使用显式强制转换来匹配类型,它就是可移植的。
答案 2 :(得分:21)
当它实际上是size_t
(32位)时,听起来好像你期望unsigned long
与unsigned int
(可能是64位)相同。在这两种情况下都尝试使用%zu
。
虽然我不完全确定。
答案 3 :(得分:16)
如果您不想使用PRI *宏,则另一种打印 ANY 整数类型的方法是强制转换为intmax_t
或uintmax_t
并使用{{1分别是}或"%jd"
。这对于没有定义PRI *宏的POSIX(或其他OS)类型特别有用,例如%ju
。