簡體   English   中英

為什么 size_t 類型的變量在 printf 調用中轉換為 (unsigned)?

[英]Why are variables of type size_t casted to (unsigned) in a printf call?

我正在編寫一個程序並在這個網站http://www.cplusplus.com/reference/cstring/strlen/ 上查找 strlen() function 我看到在使用 function 的示例中,代碼的作者 put (unsigned) 將 function 的結果轉換為 unsigned。 我知道這樣做是因為 function 返回 size_t 類型,它是無符號的,但這真的有必要嗎?

/* strlen example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char szInput[256];
  printf ("Enter a sentence: ");
  gets (szInput);
  printf ("The sentence entered is %u characters long.\n",(unsigned)strlen(szInput));
  return 0;
}

在代碼示例中,這是因為它是與printf中的%u格式說明符對應的參數。

printf 的可變參數printf必須具有完全正確的說明符類型,否則行為是 undefined %u的參數類型是unsigned的。

size_t是一個 typedef,它可能會或可能不會解析為unsigned ,因此強制轉換對於在所有平台上定義良好的調用是必要的。

另一種方法是使用專為size_t設計的%zu格式說明符,盡管這有一個實際問題,即如果庫不符合 C99,它將失敗。

這樣做是為了便攜性。 size_t格式描述符有一個修飾符,使用字母z ,如%zu (表示size_t操作數的無符號格式),它將接受size_t參數,與您使用的體系結構無關。

根據您使用的 unix 的風格,您遵循的標准,您將遇到接受或不接受z的系統,其中size_t存在或不存在(非常舊的系統沒有size_t類型)因此,作為strlen()的結果strlen()可能被代碼的作者知道很短,那么最可移植的解決方案是將數據轉換為printf()允許的類型,然后使用已知的格式說明符。 在你的情況下,作者決定使用(unsigned)因為程序可能已經從 32 位架構(有或沒有z修飾符)更改為 64 位架構,不知道它是否需要unsigned intunsigned long來指定結果. 由於字符串足夠短以適合unsigned ,因此無需使用z修飾符,用戶可能不知道該修飾符,或者她/他使用的編譯器實現中不存在該修飾符。

這很常見,因為在系統中應為off_tdev_tino_t等保留一個字母。其中許多依賴於操作系統,並且不包含在用戶通常編程的標准中。

暫無
暫無

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

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