簡體   English   中英

為什么fgets接受int而不是size_t?

[英]Why does fgets accept an int instead of a size_t?

strcpy()malloc()strlen()和其他各種函數接受它們的參數或返回值作為size_t而不是intunsigned int ,原因很明顯。

某些文件函數(如fread()fwrite()使用size_t 通過擴展,可以預期char* fgets (char *str, int num, FILE *stream)應使用size_t而不是int作為其緩沖區大小的參數。

但是, fgets()使用int 有客觀解釋為什么?

原始的K&R使用int參數在p.155上定義了fgets() 本書中提供的代碼也可以使用unsigned int (它使用>0 ,但是循環被編寫為永遠不會低於零)。

size_t稍后在C89 (ANSI C)中作為sizeof()的類型引入。 由於此功能是為協調內存分配而專門引入的,因此內存管理功能和字符串功能也相應更新。 但是文件I / O不是:在C89中使用size_t的唯一文件函數是由C89引入的新函數,並且在K&R中不存在,例如fread() / fwrite() 是的,K&R沒有這些功能,僅依靠使用文件描述符的(非便攜式)unix讀/寫功能進行塊操作。

應該注意的是, POSIX標准協調了unix功能,它是與ANSI C標准並行開發的,並於1988年末發布 該標准已經統一了許多unix函數以使用size_t因此read() / write()現在用size_t定義。 但對於C標准庫函數(如fgets() ,POSIX優先於C標准(當前版本標准的措辭):

此參考頁面上描述的功能與ISO C標准一致。 此處描述的要求與ISO C標准之間的任何沖突都是無意的。

所以在POSIX中,具有諷刺意味的是, fgets()仍然繼承了歷史悠久的K&R int


編輯:額外閱讀

stdio.h:此標頭定義並原型化了K&R第7章中列出的大多數功能。 K&R中的定義幾乎沒有任何變化,但增加了幾個新功能。

暫無
暫無

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

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