簡體   English   中英

我應該如何打印 off_t 和 size_t 等類型?

[英]How should I print types like off_t and size_t?

我正在嘗試打印off_tsize_t等類型。 可移植printf()的正確占位符是什么?

或者是否有完全不同的方式來打印這些變量?

您可以將z用於 size_t,將t用於 ptrdiff_t,如

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

但是我的手冊頁說一些較舊的庫使用了與z不同的字符,並且不鼓勵使用它。 不過,它是標准化的(按照 C99 標准)。 對於stdint.h等的intmax_tint8_t等,您可以使用宏,就像另一個答案所說:

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

它們列在inttypes.h的聯機幫助頁中。

就個人而言,我只是將值轉換為unsigned longlong就像另一個答案推薦的那樣。 如果您使用 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 中沒有 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%zptrdiff_t%t (對於 C99),但這些都沒有提到off_t 野外的建議通常會為off_t提供%u轉換,據我所知,這是“足夠正確的”( unsigned intoff_t在 64 位和 32 位系統之間變化相同)。

我至少看過這篇文章兩次,因為接受的答案對我來說很難記住(我很少使用zj標志,它們似乎與平台無關)。

標准從未明確說明size_t的確切數據長度,因此我建議您首先檢查平台上的長度size_t然后 select 其中之一:

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

我建議使用stdint類型而不是原始數據類型來保持一致性。

我記得,唯一可移植的方法是將結果轉換為“unsigned long int”並使用%lu

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

對 off_t 使用“%zo”。 (八進制)或十進制的“%zu”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM