我应该如何打印types如off_t和size_t?

我试图打印像off_tsize_ttypes。 什么是可移植的 printf()的正确占位符?

还是有一个完全不同的方式来打印这些variables?

你可以使用z代表size_t, t代表ptrdiff_t

 printf("%zu %zd", size, ptrdiff); 

但是我的手册上说一些较老的图书馆使用了不同于z字符,并且不鼓励使用它。 不过,它是标准化的(按C99标准)。 对于那些stdint.h intmax_tint8_t等等,可以使用macros,就像另一个答案所说:

 printf("value: %" PRId32, some_int32_t); printf("value: %" PRIu16, some_uint16_t); 

它们列在inttypes.h的联机帮助页面中。

就个人而言,我只是将值unsigned longlong如另一个答案build议。 如果你使用C99,那么你可以(当然也应该)转换为unsigned long longlong 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 intoff_t在64位和32位系统之间相同地变化)而言,“足够正确”。

我至less看了两次这个post,因为接受的答案很难记住(我很less使用zj标志,而且它们似乎不是平台独立的 )。

该标准从来没有说清楚size_t的确切数据长度,所以我build议你应该首先检查你的平台上的size_t长度然后select其中的一个:

 if sizeof(size_t) == 4 use PRIu32 if sizeof(size_t) == 8 use PRIu64 

我build议使用stdinttypes,而不是原始数据types作为一致性。

我记得,唯一可行的方法是将结果转换为“unsigned long int”并使用%lu

 printf("sizeof(int) = %lu", (unsigned long) sizeof(int)); 

请使用%lu。 Off_t无符号长。

使用“%zo”作为off_t。 (八进制)或十进制“%zu”。