簡體   English   中英

printf 文檔中的“簽名`size_t`”是什么意思?

[英]What does "signed `size_t`" mean in the printf documentation?

我正在查看關於 cppreference ( https://en.cppreference.com/w/c/io/fprintf ) 的 printf 文檔,我注意到當使用z修飾符和d說明符時,類型被列為“signed size_t ”。 這讓我很好奇,所以我調查了為什么不使用ssize_t只是為了發現ssize_t是 POSIX 類型而不是標准類型。 那么,這是什么類型的期待? 在尋找有符號的size_t類型時,我找不到除ssize_t以外的任何東西。

編輯:澄清一下,我在問我會用什么數據類型來表示一個有符號的size_t

“signed size_t ”的確切類型是實現定義和AFAIK,沒有標准方法來獲取類型。 所以我沒有看到可以%zd地使用%zd的方法。 在大多數平台上, ptrdiff_t應該是size_t的簽名版本,但這並不能保證。 實際上, ptrdiff_t有一個t格式修飾符,它也可以與u說明符一起使用,例如%tu ,意思是“無符號ptrdiff_t ”。 我認為這些組合只是為了完整性,沒有實際用途。

術語“signed size_t ”是非正式使用的,不會出現在語言標准中。 事實上,如果你試圖在 C 代碼中使用它,那將是一個語法錯誤。

C 標准說z長度修飾符:

指定后面的diouxX轉換說明符適用於size_t或相應的有符號整數類型參數; 或者后面的n轉換說明符適用於指向與size_t參數對應的有符號整數類型的指針。

沒有可移植的方法來確定相應的有符號整數類型是什么。 即使特定於 POSIX 的ssize_t類型(在<sys/types.h>定義)也沒有指定為對應於size_t的有符號類型。 正如 chux 在評論中指出的那樣,在某些實現中ssize_tsize_t更寬可能是有意義的,因此它可以表示最大SIZE_MAX所有值(當然還有負值)。

實際上, size_t通常是預定義的無符號整數類型unsigned intunsigned long intunsigned long long int之一的 typedef,然后%zd將需要intlong intlong long int類型的參數, 分別。 size_t也可能是根據一些擴展整數類型定義的

我的猜測是,標准的作者根本不想去努力指定z長度修飾符僅適用於有符號類型。 這樣做會增加復雜性而沒有真正的好處。 如果您使用符合 POSIX 的實現,您可能可以使用%zd打印ssize_t類型的值。

%zd沒有便攜用途,但是在printf使用它是無害的,並且可能比沒有它更容易。

暫無
暫無

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

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