Geo*_*lly 141 c portability format-specifiers
我正在尝试打印类似off_t和size_t.什么是正确的占位符printf() 是可移植的?
或者是否有完全不同的方式来打印这些变量?
Joh*_*itb 106
您可以使用zsize_t和tptrdiff_t
printf("%zu %td", size, ptrdiff);
Run Code Online (Sandbox Code Playgroud)
但我的manpage说,一些较旧的图书馆使用了不同的字符,z并且不鼓励使用它.然而,它是标准化的(按照C99标准).对于那些intmax_t和int8_t的stdint.h等等,还有你可以使用宏,像另一个回答说:
printf("value: %" PRId32, some_int32_t);
printf("value: %" PRIu16, some_uint16_t);
Run Code Online (Sandbox Code Playgroud)
它们列在的联机帮助页中inttypes.h.
就个人而言,我只是将值转换为unsigned long或者long像另一个答案推荐.如果您使用的C99,那么你可以(而且应该,当然)转换为unsigned long long或long long并使用%llu或%lld分别格式.
Ste*_*sop 102
要打印off_t:
printf("%jd\n", (intmax_t)x);
Run Code Online (Sandbox Code Playgroud)
要打印size_t:
printf("%zu\n", x);
Run Code Online (Sandbox Code Playgroud)
要打印ssize_t:
printf("%zd\n", x);
Run Code Online (Sandbox Code Playgroud)
请参阅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.
| 归档时间: |
|
| 查看次数: |
132912 次 |
| 最近记录: |