平台无关size_t c中的格式说明符?

Eth*_*man 76 c size-t platform-independent format-specifiers format-string

我想size_t在C中打印出一个类型的变量,但似乎size_t在不同的体系结构上别名为不同的变量类型.例如,在一台计算机(64位)上,以下代码不会抛出任何警告:

size_t size = 1;
printf("the size is %ld", size);
Run Code Online (Sandbox Code Playgroud)

但在我的另一台机器(32位)上面的代码会产生以下警告消息:

警告:格式'%ld'需要类型'long int*',但参数3的类型为'size_t*'

我怀疑这是由于指针大小的不同,所以在我的64位机器size_t上别名为a long int("%ld"),而在我的32位机器size_t上别名为另一种类型.

是否有专门用于的格式说明符size_t

Ada*_*eld 110

是:使用z长度修饰符:

size_t size = sizeof(char);
printf("the size is %zu\n", size);  // decimal size_t ("u" for unsigned)
printf("the size is %zx\n", size);  // hex size_t
Run Code Online (Sandbox Code Playgroud)

可用的其他长度修饰符是hh(for char),h(for short),l(for long),ll(for long long),j(for intmax_t),t(for ptrdiff_t)和L(for long double).参见C99标准的第7.19.6.1(7)节.

  • 是的,所以在这种情况下,你应该使用`%zu`,因为参数是无符号的. (25认同)
  • @detly:不,`z`长度修饰符不是C89/C90的一部分.如果您的目标是符合C89的代码,那么您可以做的最好的是转换为`unsigned long`并使用`l`长度修饰符,例如`printf("size is%lu \n",(unsigned long) )大小);`; 支持C89和`size_t`大于`long`的系统比较棘手,需要使用多个预处理器宏. (7认同)

max*_*zig 40

就在这里.它是%zu(如ANSI C99中所规定的).

size_t size = 1;
printf("the size is %zu", size);
Run Code Online (Sandbox Code Playgroud)

请注意,这size_t是无符号的,因此%ld是双重错误:错误的长度修饰符和错误的格式转换说明符.如果你想知道,%zdssize_t(签名).