2011-08-04 54 views

回答

10

您正在聲明一個名爲func的函數的原型,它不返回任何內容並且不帶任何參數。這是(函數調用和函數原型之間的細微區別)之一。請注意,main以上的行void func() {assert(0);}對這是原型還是調用沒有影響。你可以刪除它,代碼會做同樣的事情 - 也就是說什麼都沒有。

這也告訴你,你可以重新聲明函數原型。你甚至可以有這樣的:

int main() { 
    void blah(); 
    void blah(); 
    void blah(); 
    void blah(); 
} 

而且代碼仍然會做它之前做的 - 沒有。

如果您離開void,它會調用該函數。

而且,請注意,在這需要參數的功能的情況下,這樣的:

int main() { func(4); } 

不會變成一個原型,如果你以前像這樣添加void

int main() { void func(4); } 

它只會產生語法錯誤。

4

即使不需要,也可以聲明函數。這就是你所做的,重新宣佈了這個功能。

5

正如其他人所指出的那樣,線

void func(); 

內的main被當作一個函數原型,而不是功能func的調用。在C和C++中,如果你願意,你可以在函數內聲明函數原型,儘管在實際中很少這樣做。

這是合法的事實會給程序員帶來各種麻煩。例如,如果你重寫了代碼

(void) func(); 

那麼這將彙編爲func調用其返回類型是明確鑄造到void,表示「我不關心這個返回值。」換句話說,這組圓括號將聲明變爲聲明。

Object myObject(); 

雖然

Object myObject(137); 

並創建:

在C++中,這個問題可以通過以下事實:低於該代碼是一個函數原型,而不是一個變量聲明調用默認構造配混該對象並將其傳遞給構造函數137,並且

Object myObject; 

crea在不調用構造函數的情況下測試該對象。

當調用其構造函數時嘗試聲明一個對象時出現了一種稱爲「最令人頭痛的解析」的語言的可怕邊緣情況。例如,這個代碼是合法的C++,但它是一個函數聲明,而不是一個變量聲明:

set<int> mySet(istream_iterator<int>(cin), istream_iterator<int>()); 

的問題是,這可能被解析爲函數聲明,而不是接受兩個臨時一個創建一個對象istream_iterator<int> s作爲參數。爲了解決這個問題,在C++中,你不得不寫

set<int> mySet(istream_iterator<int>(cin), (istream_iterator<int>())); 

其中,如上,額外的括號強行從一個函數原型是一個聲明消除歧義的語句。

希望這會有所幫助!

0

您在main()中聲明瞭本地函數void func()void語句指示編譯器它是聲明而不是函數調用。所以,刪除void,你的函數將被調用。