2011-03-17 99 views
0

C中的變量長度參數列表函數如printf() , scanf(), etc如何與C++中的函數重載不同?在C中重載還是不重載?

以及如何調用

printf("Didnt Work %s",s);

printf(s,"Didnt Work %s");

不同,其中S定義爲:

const char *s="string"; 

請解釋。

回答

6

const char *s="string"; 
printf(s,"Didnt Work %s"); 

的第一個參數 「串」 被解釋爲格式字符串。它沒有插入代碼,所以第二個參數不會被使用。結果將是「字符串」。

OTOH

printf("Didnt Work %s",s); 

有插入的代碼,所以第二個參數被插入一個字符串,其結果是「沒有工作字符串」。

這不是重載,因爲雖然不同的參數類型是可能的,就像在重載中一樣,但在變量參數中總是調用相同的函數。隨着重載,根據參數類型調用不同的函數。

0

重載允許編譯器檢查參數的特定順序。在C++中,如果至少有一個函數定義的類型不匹配,編譯器會發出抱怨。另一方面,具有可變長度參數的C,在編譯時沒有這種類型檢查。編譯器不檢查任何參數以確保它們排隊。如果不是全部編譯器,則可以編譯printf("1",3);。 Printf將嘗試將第一個參數作爲字符串讀取,並將繼續讀取,直到它到達表示字符串結尾的空字節。這就是爲什麼不鼓勵變長參數列表的原因。

+1

'printf(1,3);'不會在任何編譯器上編譯。 「printf」的第一個參數是鍵入的,也就是說,它需要一個「const char *」。但是你的論點在變長參數不安全的原則上是正確的。 – 2011-03-17 06:09:29

+0

你是完全正確的。我應該解決這個問題... – datdo 2011-03-17 15:08:46

0

要回答你的第二個問題,其他人已經第一個問題了。

C中的變量參數列表與C++中的重載非常不同。在C語言中,你有一個函數printf,它可能對不同類型的參數做不同的事情。在C++中,通過重載,您可以根據參數的類型在不同的函數中進行選擇。