2013-04-03 29 views
3

以下函數使用int作爲第二個參數類型,爲什麼函數memchr()使用`int`作爲`char`類型的參數?

memchr(const void *buf, int ch, size_t count); 

雖然它被用於character類型。爲什麼定義的函數使用int作爲參數char類型?這有什麼特別的原因嗎?

+2

你可能也想讀這個基本上是相同的問題。 http://stackoverflow.com/questions/5919735/why-does-memset-take-an-int-instead-of-a-char – tangrs 2013-04-03 21:45:31

回答

2

這是因爲這是一個非常「舊」的標準函數,它存在於C語言演化的早期階段。

舊版本的C沒有像函數原型這樣的東西。函數不是未聲明的,就是用「未知」參數列表聲明的,例如

void *memchr(); /* non-prototype declaration */ 

當調用這樣的功能,所有參數進行自動參數提升,這意味着,這樣的功能的沒有收到char類型或short的參數值。這樣的參數總是自動提升爲int,而函數本身實際上收到了int。 (在現代C中,對於上面聲明的功能(即沒有原型),這仍然是真實的)。

當最終C語言發展到原型引入函數聲明時,重要的是將新聲明與標準功能的遺留行爲和已編譯的遺留庫。

這就是爲什麼你永遠不會在傳統的函數聲明的參數列表看到這樣的類型,charshort的原因。出於同樣的原因,您不會看到在那裏使用的型號float

1

因爲char,signed charunsigned char是三種不同的類型。在具體實現中,您不知道char是有符號還是無符號。

除了在罕見的系統中(見Keith的筆記),int類型包含這三種類型可以具有的所有值。

+0

和EOF太.... – 2013-04-03 21:44:19

+1

'EOF'不是字符:) – pmg 2013-04-03 21:45:59

+0

在大多數系統上。如果'sizeof(int)== 1'(暗示'CHAR_BIT> = 16'),那麼'int'可能無法保存'unsigned char'類型的所有值。這種系統很少見。 – 2013-04-03 21:46:24

1

所有處理字符的標準函數都是這樣做的。我認爲其原因部分是歷史性的(在一些C標準版本中,函數不能採取charunsigned char的參數,就像可變參數不能有字符類型一樣),部分是爲了所有這些函數的一致性。

有幾個字符處理函數使用int以允許EOF的可能性,但memchr是不是其中之一。

+0

你真的是指「EOL」嗎? – 2013-04-03 21:47:13

+1

@凱斯:不,我不知道 – 2013-04-03 21:48:28

相關問題