Uint32_t 和 size_t 的 printf 格式说明符

我有以下几点

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

非常感谢你的建议,

285101 次浏览

听起来你希望 size_tunsigned long(可能是64位)一样,而实际上它是 unsigned int(32位)。尝试在两种情况下都使用 %zu

不过我也不是很确定。

Try

#include <inttypes.h>
...


printf("i [ %zu ] k [ %"PRIu32" ]\n", i, k);

The z represents an integer of length same as size_t, and the PRIu32 macro, 在 C99头 inttypes.h中定义, represents an unsigned 32-bit integer.

如果您不想使用 PRI * 宏,打印 任何整数类型的另一种方法是强制转换为 intmax_tuintmax_t,并分别使用 "%jd"%ju。这对于没有定义 PRI * 宏的 POSIX (或其他操作系统)类型特别有用,例如 off_t

所有需要的是格式说明符和类型达成一致,并且您总是可以进行强制转换以实现这一点。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将等效于从数组中读取太多或太少的内存。只要使用显式强制转换来匹配类型,它就是可移植的。