2012-07-23 39 views

回答

11

它不會將它放入對象的名稱表中,以防止它被鏈接到其他東西。

6

函數和其他名稱在目標文件中導出爲符號。鏈接器使用這些符號來解析鏈接時的各種懸掛引用(例如,調用另一個文件中定義的函數)。當你聲明它爲static時,它不會被導出爲符號。因此它不會被任何其他文件拾取。如果你有一個指向它的函數指針,你仍然可以從另一個文件中調用它。

2

事實上恰恰相反。當一個函數是而不是靜態時,其名稱被寫入目標文件的某個地方,然後鏈接器可以使用該目標文件將使用此函數的其他目標文件鏈接到該函數的地址。

當函數聲明爲static時,編譯器根本不會在那裏輸入名稱。

12

聲明函數static並沒有真正防止它被從其他翻譯單元稱爲

static確實這是什麼阻止功能從通過名稱爲稱爲)從其他的翻譯單元。這將消除直接調用該功能的可能性,即調用「按名稱」。爲了達到這個目的,編譯器只需從轉換單元導出的外部名稱表中排除函數名稱。除此之外,靜態函數絕對沒有什麼特別之處。

您仍然可以致電通過其他方式從其他翻譯單元起作用。例如,如果您以某種方式在其他翻譯單元中獲得了指向static函數的指針,則可以通過該指針調用它。

相關問題