用于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 

非常感谢您的任何build议,

听起来就像你期待的size_tunsigned long (可能是64位)相同,当它实际上是一个unsigned int (32位)。 在这两种情况下尝试使用%zu

我不完全确定。

尝试

 #include <inttypes.h> ... printf("i [ %zu ] k [ %"PRIu32" ]\n", i, k); 

z表示与size_t相同长度的整数,而在C99头文件inttypes.h定义的PRIu32macros表示无符号的32位整数。

所有需要的是格式说明符和types都是一致的,而且你总是可以投入使用。 long至less为32位,所以%lu(unsigned long)k总是正确的:

 uint32_t k; printf("%lu\n", (unsigned long)k); 

size_t更棘手,这就是为什么%zu被添加到C99中的原因。 如果你不能使用它,那就把它看作klong是C89中最大的types, size_t不可能是更大的)。

 size_t sz; printf("%zu\n", sz); /* C99 version */ printf("%lu\n", (unsigned long)sz); /* common C89 version */ 

如果你没有得到格式说明符正确的types,那么printf将等同于从数组中读取太多或者太less的内存。 只要你使用明确的转换来匹配types,它是可移植的。

如果您不想使用PRI *macros,则打印ANY整数types的另一种方法是将其intmax_tintmax_tuintmax_t并分别使用"%jd"%ju 。 这对于没有定义PRI *macros的POSIX(或其他操作系统)types特别有用,例如off_t