[英]Why does fgets accept an int instead of a size_t?
strcpy()
, malloc()
, strlen()
和其他各種函數接受它們的參數或返回值作為size_t
而不是int
或unsigned 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.