用于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定义的PRIu32macros表示无符号的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 。