C printf是否需要%zu说明符?

C printf是否需要%zu说明符?,c,printf,c89,size-t,c-libraries,C,Printf,C89,Size T,C Libraries,我们在嵌入式平台上使用C89。我试图打印出一个大小\u t,但不起作用: #include <stdio.h> int main(void) { size_t n = 123; printf("%zu\n",n); return 0; } #包括 内部主(空){ 尺寸n=123; printf(“%zu\n”,n); 返回0; } 我得到的不是123,而是zu 其他说明符工作正常 如果size\u t存在,则zu不应该也可以在printf中找到吗? 这是我

我们在嵌入式平台上使用C89。我试图打印出一个
大小\u t
,但不起作用:

#include <stdio.h>
int main(void) {
    size_t n = 123;
    printf("%zu\n",n);
    return 0;
}
#包括
内部主(空){
尺寸n=123;
printf(“%zu\n”,n);
返回0;
}
我得到的不是
123
,而是
zu

其他说明符工作正常

如果
size\u t
存在,则
zu
不应该也可以在
printf
中找到吗?
这是我应该与我的库供应商联系的问题,还是允许库实现将其排除在外

如果尺寸存在,zu是否也应在printf中提供

size\u t
至少自C89起就存在,但相应的格式说明符
%zu
(特别是长度修饰符
z
)仅自C99起添加到标准中

因此,如果您不能使用C99(或C11)并且必须在C89中打印
size\t
,您只需回退到其他现有类型,例如:

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

这很好用。在我的系统中,它正在打印期望值。 由于编译器的原因,您可能会遇到错误。我正在使用GCC编译器。如果您只有这个,并且试图获得输出,请首先更新GCC,然后重试。它会起作用的


大小\u t由sizeof()返回。%zu说明符打印长度。因此,要返回n的大小,代码应为:#include


int main(void){size_t n=123;printf(“%zu\n”,sizeof(n));返回0;`}

我相信
z
前缀是在C99中添加的。@KerrekSB Ok。它似乎没有注释。为什么C++引用会对C标准提出任何解释?是否…现在在cppreferenceNote上标记,在
无符号长
大到足以容纳最大可能值
n
的任何平台上,上述代码都是足够的,尽管不一定是有效的(无论它是否大到足以处理整个
大小
)。但是,不能保证
size\u t
不会大于
无符号长
,也不能保证
n
始终适合
无符号长
。我不知道这会是一个多大的问题[如果许多程序计算sprintf缓冲区的大小,它们可能会遇到不同的问题……基于一个假设,十进制格式的无符号长的最大长度是10位,并且输出的值最终会比这个长]。为了更好的可移植性,请使用
printf(“%llu\n”,(unsigned long)n);
,除非您知道大小很小,例如
sizeof(int)
,在这种情况下,您只需编写
printf(“%u\n”,(unsigned)n);
@chqrlie
无符号长
在C89中不存在-这就是我建议
无符号长
的原因。如果
无符号长
可用(C99),那么
%zu
size\u t
说明符也将可用。因此根本不需要在此处强制转换为
无符号long
。问题实际上是在C库中。不支持
%zu
的常见情况是将gcc与系统的Microsoft C l结合使用的旧版本的MinGW直到最近才支持大多数C99扩展的Library。