我应该如何打印types如off_t和size_t?
我试图打印像off_t
和size_t
types。 什么是可移植的 printf()
的正确占位符?
还是有一个完全不同的方式来打印这些variables?
你可以使用z
代表size_t, t
代表ptrdiff_t
printf("%zu %zd", size, ptrdiff);
但是我的手册上说一些较老的图书馆使用了不同于z
字符,并且不鼓励使用它。 不过,它是标准化的(按C99标准)。 对于那些stdint.h
intmax_t
和int8_t
等等,可以使用macros,就像另一个答案所说:
printf("value: %" PRId32, some_int32_t); printf("value: %" PRIu16, some_uint16_t);
它们列在inttypes.h
的联机帮助页面中。
就个人而言,我只是将值unsigned long
或long
如另一个答案build议。 如果你使用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中没有整数types的格式化代码,并保证是大作为这些types。 所以你需要做一些特定于实现的东西。
例如,如果你的编译器有long long
而你的标准库支持%lld
,那么你可以很自信地期望它能代替intmax_t
。 但是如果不行的话,你将不得不退缩,这在其他一些实现上会失败,因为它太小了。
对于微软来说,答案是不一样的。 VS2013在很大程度上符合C99标准,但“不支持hh,j,z和t长度前缀”。 对于size_t“,即32位平台上的无符号__int32,64位平台上的无符号__int64”使用types说明符o,u,x或X的前缀I(大写字母)。 请参阅VS2013 Size规范
至于off_t,在VC \ include \ sys \ types.h中定义为long。
你使用哪个版本的C?
在C90中,标准做法是根据情况将其打上有符号或无符号长度,并相应地打印出来。 我已经看到了size_t的%z,但是Harbison和Steele在printf()中没有提及它,并且无论如何对ptrdiff_t或其他什么都没有帮助。
在C99中,各种_ttypes都有自己的printfmacros,所以像"Size is " FOO " bytes."
我不知道细节,但这是一个相当大的数字格式包含文件的一部分。
您将要使用来自inttypes.h的格式化macros。
看到这个问题: 跨平台格式string的variablestypessize_t?
看看Linux,OS X和OpenBSD上的man 3 printf
,对于size_t
和%t
对于ptrdiff_t
(对于C99)都显示支持,但是没有一个提到off_t
。 在野外的build议通常会提供off_t
的%u
转换,就我所知( unsigned int
和off_t
在64位和32位系统之间相同地变化)而言,“足够正确”。
我至less看了两次这个post,因为接受的答案很难记住(我很less使用z
或j
标志,而且它们似乎不是平台独立的 )。
该标准从来没有说清楚size_t
的确切数据长度,所以我build议你应该首先检查你的平台上的size_t
长度然后select其中的一个:
if sizeof(size_t) == 4 use PRIu32 if sizeof(size_t) == 8 use PRIu64
我build议使用stdint
types,而不是原始数据types作为一致性。
我记得,唯一可行的方法是将结果转换为“unsigned long int”并使用%lu
。
printf("sizeof(int) = %lu", (unsigned long) sizeof(int));
请使用%lu。 Off_t无符号长。
使用“%zo”作为off_t。 (八进制)或十进制“%zu”。