我正在尝试打印类似off_t
和size_t
.什么是正确的占位符printf()
是可移植的?
或者是否有完全不同的方式来打印这些变量?
您可以使用z
size_t和t
ptrdiff_t
printf("%zu %td", size, ptrdiff);
但我的manpage说,一些较旧的图书馆使用了不同的字符,z
并且不鼓励使用它.然而,它是标准化的(按照C99标准).对于那些intmax_t
和int8_t
的stdint.h
等等,还有你可以使用宏,像另一个回答说:
printf("value: %" PRId32, some_int32_t); printf("value: %" PRIu16, some_uint16_t);
它们列在的联机帮助页中inttypes.h
.
就个人而言,我只是将值转换为unsigned long
或者long
像另一个答案推荐.如果您使用的C99,那么你可以(而且应该,当然)转换为unsigned long long
或long long
并使用%llu
或%lld
分别格式.
要打印off_t
:
printf("%jd\n", (intmax_t)x);
要打印size_t
:
printf("%zu\n", x);
要打印ssize_t
:
printf("%zd\n", x);
请参阅C99标准中的7.19.6.1/7,或更方便的格式代码POSIX文档:
http://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html
如果您的实现不支持这些格式化代码(例如,因为您使用的是C89),那么您有一些问题,因为AFAIK在C89中没有具有格式代码且保证一样大的整数类型作为这些类型.所以你需要做一些特定于实现的事情.
例如,如果您的编译器具有long long
并且您的标准库支持%lld
,您可以自信地期望它将代替intmax_t
.但如果没有,你将不得不退回long
,这将在其他一些实现上失败,因为它太小了.
对于微软来说,答案是不同的.VS2013在很大程度上符合C99标准,但"不支持hh,j,z和t长度前缀." 对于size_t"即32位平台上的无符号__int32,64位平台上的无符号__int64"使用带有类型说明符o,u,x或X的前缀I(大眼). 请参阅VS2013大小规范
对于off_t,它在VC\include\sys\types.h中定义为long.