我是C++的新手。我不明白爲什麼它可以(也就是爲什麼編譯器允許它)爲一個函數聲明兩次。例如,下面的代碼是合法的:C++函數聲明
#include <iostream>
#include <string>
int hello();
int hello();
int main(){
cout << "hello, world" << endl;
}
int hello(){
return 1;
}
爲什麼編譯器不會抱怨?
我是C++的新手。我不明白爲什麼它可以(也就是爲什麼編譯器允許它)爲一個函數聲明兩次。例如,下面的代碼是合法的:C++函數聲明
#include <iostream>
#include <string>
int hello();
int hello();
int main(){
cout << "hello, world" << endl;
}
int hello(){
return 1;
}
爲什麼編譯器不會抱怨?
在C和C++向前聲明是非常弱的。它們爲編譯器提供了一個正式的「承諾」,即如果具有指定簽名的函數完全出現,它將擁有您指定的簽名。該函數甚至不能保證出現:除非您調用或以其他方式引用聲明的函數,否則編譯器不會抱怨沒有定義的聲明。該標準要求編譯器將相同的前向聲明視爲單個聲明。
不像必須根據單一的定義規則
的多個定義是唯一的定義3.2無翻譯單元應包含任何變量,函數,類型,枚舉類型,或模板
聲明僅僅需要來指代相同的定義,即,是彼此相等:
3.3.4給定一組的decla口糧在相同的陳述區域,每一個都指定相同的非限定名稱,它們應該都指同一個實體,或者全部指的是功能或功能模板,[...]
您的疑問將被「一個定義規則」清除。它在ISO C++標準(ISO/IEC 14882)2003中的3.2節中定義。
它指出:
在任何翻譯單元,模板,類型,功能,或者對象可以 具有不超過一個定義的更多。其中一些可以有任何數量的 聲明。
瞭解更多關於它的維基百科(http://en.wikipedia.org/wiki/One_Definition_Rule)
它可以被聲明爲許多隻要你想要的時間。否則,不同的標題不能很好地結合在一起。 – chris