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

时间:2010-01-24 03:47:12

标签: c platform-independent size-t format-string format-specifiers

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

size_t size = 1;
printf("the size is %ld", size);

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

  

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

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

是否有专门针对size_t的格式说明符?

3 个答案:

答案 0 :(得分:102)

是:使用z长度修饰符:

size_t size = sizeof(char);
printf("the size is %zd\n", size);  // decimal size_t
printf("the size is %zx\n", size);  // hex size_t

可用的其他长度修饰符为hh(适用于char),h(适用于short),l(适用于long }),ll(适用于long long),j(适用于intmax_t),t(适用于ptrdiff_t)和{{1} }(对于L)。参见C99标准的第7.19.6.1(7)节。

答案 1 :(得分:35)

是的,有。它是%zu(在ANSI C99中指定)。

size_t size = 1;
printf("the size is %zu", size);

请注意size_t是无符号的,因此%ld是双重错误的:错误的长度修饰符和错误的格式转换说明符。如果您想知道,%zd适用于ssize_t(已签名)。

答案 2 :(得分:0)

MSDN,表示Visual Studio支持32位和64位平台上可移植代码的“I”前缀。

size_t size = 10;
printf("size is %Iu", size);