2015-03-02 142 views
1

我試圖在函數中看到默認參數提升。具體而言,我想測試第6.5.2.2節函數調用(描述爲here)。函數默認參數提升

我想要一個無原型的函數調用,以查看默認參數提升爲整數,但我得到「函數不帶1個參數」錯誤。這是我想要做的:

#include<iostream> 
using namespace std; 

//void Func(char val); 
//void Func(int val); 
void Func(); // No prototype 

int main(int argc, char** argv) 
{ 
    char charVal = 'a'; 
    cout << "Func(charVal) - "; Func(charVal); 

    return 0; 
} 

void Func(char val) 
{ 
    cout << "Char arg. Result: " << val << endl; 
} 

void Func(int val) 
{ 
    cout << "Int arg. Result: " << val << endl; 
} 

我期望看到由於參數提升而被調用的函數(int)。 這是否已從標準中刪除?

乾杯。

P.S-我剛纔看到這種無原型聲明是C標準NOT C++的一部分。爲什麼C++不支持它的任何特定原因?

+4

只有'Func()'重載在範圍內 - 一個採用零參數的重載。促銷與此無關。如果其他重載在範圍內,則會選擇'Func(char)'重載。 – 0x499602D2 2015-03-02 15:08:09

回答

4

所有功能(以及一般命名實體)都需要在使用前進行聲明。當您嘗試使用main中的參數調用它時,您只聲明瞭沒有參數的重載(這是C++中空參數列表的含義)。

您在文件開頭有正確的聲明,但出於某種原因,您需要的聲明已被註釋掉。取消它們的註釋並沒有問題。

我剛纔看到這種無原型聲明是C標準NOT C++的一部分。爲什麼C++不支持它的任何特定原因?

因爲C++支持重載。重載解析發生在編譯時,調用函數的地方,只有編譯器知道它們存在時才考慮候選項 - 也就是說,如果它們已經完全聲明,以便編譯器可以將它們的簽名與參數類型相匹配函數調用。

在C中,編譯器知道你的意思是哪個函數,它是否知道參數類型,因爲它是唯一具有該名稱的函數。這些聲明僅僅是危險的,從參數類型中去除了類型檢查,併爲各種錯誤打開了大門。

2

C++從來不支持無原型函數聲明。 C++中的空參數列表意味着沒有參數,而不是缺乏原型。

原因是C++有類型安全的鏈接,如果你沒有原型,那就不起作用。而C++具有類型安全的鏈接,因爲這只是一個好主意並減少了錯誤。 (你可以閱讀的C設計&演進++的更多細節。)用C

參數提升++只存在於調用真正的可變參數的功能,即那些在參數列表...聲明。