2011-10-23 36 views
4

有這樣的代碼:差異與extern和沒有它

#include <iostream> 

extern void fun(); 

int main(){ 
    fun(); 
    return 0; 
} 

void fun(){ std::cout << "Hello" << std::endl; } 

是否有聲明之間存在差異:

extern void fun(); 
void fun(); 

?上面的代碼與extern和extern關鍵字的行爲相同。

+4

當「extern」應用於函數原型時,沒有區別 – Arunmu

回答

7

函數聲明確實有external linkage默認情況下,所以加入extern關鍵字函數聲明沒有區別,它是多餘的。

2

兩種說法之間的區別是:

extern void fun(); 

告訴編譯器和鏈接器在另一個文件中查找時,此文件中的代碼指的是樂趣(),也許是通過調用樂趣();這種生產被稱爲「聲明」。

void fun () { 
    ... 
} 

定義的函數fun()和,因爲它在該文件中定義,避免了需要鏈接器查找功能的其他地方。

有沒有在聲明函數extern沒有壞處:鏈接做正確的事。

+0

'告訴編譯器和鏈接器在該文件中的代碼引用fun()時看另一個文件()' 我不認爲這是正確的。編譯器將產生用於'extern'類型說明符的函數調用_irrespectively_的佔位符值。 作爲正確答案說明,'extern'符是多餘的。 如果編譯器會被自己這樣做會incoporate連接邏輯。鏈接器作業是通過符號表並通過函數的最終地址解析佔位符值。 – SebNag