2017-08-17 104 views
5

不應該返回類型size_t而不是?因爲C中的對象的大小是這種類型的,包括傳遞給printf的字符串。爲什麼printf在C中返回int而不是size_t

+5

這只是歷史 - 在事實發生後你不能輕易改變這些東西,而不會破壞現有的代碼,並且當單個'printf'的輸出不可能超過32k時,沒有真正的動機,更不用說2G了。 –

+0

@PaulR是否意味着它應該是'size_t'類型? –

+4

請記住,['printf'返回值](http://en.cppreference.com/w/c/io/fprintf#Return_value)可以是* negative *。 ['size_t'類型](http://en.cppreference.com/w/c/types/size_t)是未簽名的。 –

回答

8

爲什麼printf在C中返回int?
不應該是size_t而是?

它本來可以這樣做,但早期的設計決定是容納負的EOF的返回值來指示錯誤。

size_t在早期設計選擇中是事後纔想到的。許多功能使用int其中size_t現在用於那些預標準天。


fprintf()具有環境限制「可以由任何單一的轉換來產生應至少爲4095的字符數」,以便嘗試輸出可運行成限制任何打印之前INT_MAX/SIZE_MAX的關注。

+1

非常好的答案,如果你問我 –

+0

@ Jean-FrançoisFabre補充說明:在1970年,RAM的價格大約是[0.70美元,大約每字節1/2工時](http://www.statisticbrain.com/average-歷史價格-的-RAM /)。早期的設計選擇需要考慮用於減少代碼/內存空間的計算機和策略的非常昂貴的成本。 'int'很簡單。 – chux

+0

因此''printf',出於某種原因,或者不符合標準? 因爲它使用'int'來保存字符數。 –

0

當時編譯器不需要函數聲明來調用函數。沒有聲明或未指定返回類型的函數的返回類型爲int - 隱式int規則。一些代碼被稱爲printf,而沒有討厭討厭#include <stdio.h>

1

你基本上是對的 - 實際上printf應該返回一個更大的類型,因爲從理論上講,輸出比可以放入內存的最大對象的大小更多的字節是可能的。 printf("%s%s", largest_string, largest_string)或甚至更多使用字段寬度/精度的簡單示例。

原因只是我們堅持的一個歷史性錯誤。這對snprintf尤其不利,它被人爲地限制爲INT_MAX,並且如果嘗試使用它創建更長的字符串,則會被迫返回錯誤。

+0

仍然存在返回負數的問題。指示錯誤。 如果現在要重新設計它,你會怎麼做? –

+1

@BiteBytes:要麼使用一個足夠大的類型來使用類型的符號形式,要麼使用'(T)-1',其中'T'是一個無符號類型作爲錯誤指示。請注意,這適用於'snprintf',其中'retval> = n'是您無論如何需要檢查的錯誤條件(導致負回報的截斷或錯誤)。 –

+0

@R ..使用'(T)-1'是個好主意。 'int retval = snprintf(... size_t n,...'和'retval> = n'除了幻想平臺外很好,其中'retval> = n'的INT_MAX> SIZE_MAX是一個帶符號的比較。 – chux

相關問題