2013-05-20 186 views
3

我是C++的新手。我不明白爲什麼它可以(也就是爲什麼編譯器允許它)爲一個函數聲明兩次。例如,下面的代碼是合法的:C++函數聲明

#include <iostream> 
#include <string> 

int hello(); 
int hello(); 

int main(){ 
    cout << "hello, world" << endl; 
} 

int hello(){ 
    return 1; 
} 

爲什麼編譯器不會抱怨?

+1

它可以被聲明爲許多隻要你想要的時間。否則,不同的標題不能很好地結合在一起。 – chris

回答

1

在C和C++向前聲明是非常弱的。它們爲編譯器提供了一個正式的「承諾」,即如果具有指定簽名的函數完全出現,它將擁有您指定的簽名。該函數甚至不能保證出現:除非您調用或以其他方式引用聲明的函數,否則編譯器不會抱怨沒有定義的聲明。該標準要求編譯器將相同的前向聲明視爲單個聲明。

不像必須根據單一的定義規則

3.2無翻譯單元應包含任何變量,函數,類型,枚舉類型,或模板

的多個定義是唯一的定義

聲明僅僅需要來指代相同的定義,即,是彼此相等:

3.3.4給定一組的decla口糧在相同的陳述區域,每一個都指定相同的非限定名稱,它們應該都指同一個實體,或者全部指的是功能或功能模板,[...]

0

您的疑問將被「一個定義規則」清除。它在ISO C++標準(ISO/IEC 14882)2003中的3.2節中定義。

它指出:

在任何翻譯單元,模板,類型,功能,或者對象可以 具有不超過一個定義的更多。其中一些可以有任何數量的 聲明。

瞭解更多關於它的維基百科(http://en.wikipedia.org/wiki/One_Definition_Rule