用于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_t
是unsigned long
(可能是64位)相同,当它实际上是一个unsigned int
(32位)。 在这两种情况下尝试使用%zu
。
我不完全确定。
尝试
#include <inttypes.h> ... printf("i [ %zu ] k [ %"PRIu32" ]\n", i, k);
z
表示与size_t
相同长度的整数,而在C99头文件inttypes.h
定义的PRIu32
macros表示无符号的32位整数。
所有需要的是格式说明符和types都是一致的,而且你总是可以投入使用。 long
至less为32位,所以%lu
与(unsigned long)k
总是正确的:
uint32_t k; printf("%lu\n", (unsigned long)k);
size_t
更棘手,这就是为什么%zu
被添加到C99中的原因。 如果你不能使用它,那就把它看作k
( long
是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_t
为intmax_t
或uintmax_t
并分别使用"%jd"
或%ju
。 这对于没有定义PRI *macros的POSIX(或其他操作系统)types特别有用,例如off_t
。