![](/img/trans.png)
[英]How to use printf to display off_t, nlink_t, size_t and other special types?
[英]How should I print types like off_t and size_t?
我正在嘗試打印off_t
和size_t
等類型。 可移植的printf()
的正確占位符是什么?
或者是否有完全不同的方式來打印這些變量?
您可以將z
用於 size_t,將t
用於 ptrdiff_t,如
printf("%zu %td", size, ptrdiff);
但是我的手冊頁說一些較舊的庫使用了與z
不同的字符,並且不鼓勵使用它。 不過,它是標准化的(按照 C99 標准)。 對於stdint.h
等的intmax_t
和int8_t
等,您可以使用宏,就像另一個答案所說:
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 中沒有 integer 類型具有格式代碼並且保證是一樣大作為這些類型。 所以你需要做一些特定於實現的事情。
例如,如果您的編譯器long long
並且您的標准庫支持%lld
,您可以自信地期望它將代替intmax_t
。 但如果沒有,您將不得不退回到long
,這在其他一些實現上會失敗,因為它太小了。
對於微軟來說,答案是不同的。 VS2013 在很大程度上符合 C99,但“不支持 hh、j、z 和 t 長度前綴。” 對於 size_t “即 32 位平台上的無符號 __int32,64 位平台上的無符號 __int64”使用前綴 I(大寫眼睛)和類型說明符 o、u、x 或 X。請參閱 VS2013 大小規范
至於off_t,在VC\include\sys\types.h中定義為long。
您使用的是哪個版本的 C?
在 C90 中,標准做法是酌情轉換為有符號或無符號長,並相應地打印。 我見過 size_t 的 %z,但是 Harbison 和 Steele 沒有在 printf() 下提到它,而且無論如何這對 ptrdiff_t 或其他什么都沒有幫助。
在 C99 中,各種 _t 類型都有自己的 printf 宏,因此類似於"Size is " FOO " bytes."
我不知道細節,但這是一個相當大的數字格式包含文件的一部分。
您需要使用 inttypes.h 中的格式化宏。
請參閱此問題: size_t 類型變量的跨平台格式字符串?
查看 Linux 上的man 3 printf
,OS X 和 OpenBSD 都顯示支持size_t
的%z
和ptrdiff_t
的%t
(對於 C99),但這些都沒有提到off_t
。 野外的建議通常會為off_t
提供%u
轉換,據我所知,這是“足夠正確的”( unsigned int
和off_t
在 64 位和 32 位系統之間變化相同)。
我記得,唯一可移植的方法是將結果轉換為“unsigned long int”並使用%lu
。
printf("sizeof(int) = %lu", (unsigned long) sizeof(int));
對 off_t 使用“%zo”。 (八進制)或十進制的“%zu”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.