2012-01-18 84 views
1

我有一個理論問題。外部靜態函數聲明是否打破內部鏈接?

下面是一個例子:

file1.c中

static void foo() 
{ 
    ... 
} 

file2.c中

extern void foo(); 

main() 
{ 
    foo(); 
} 

編譯就可以了。

那麼,extern打破了靜態聲明的內部聯繫?

+0

什麼是令人驚訝的你?編譯器一次只能在一個編譯單元上運行。鏈接器可能會抱怨。 – 2012-01-18 12:38:19

+0

另外,你的'主'是不正確的。它可以接受任意數量的參數。 – 2012-01-18 12:38:25

+0

你也試過鏈接程序嗎? – nos 2012-01-18 12:39:32

回答

4

理論上只是「編譯好」,還是你真的測試過這個?

一個static功能不應該從編譯單元外部可見的(C文件,通常情況下),它在。

在不同的編譯單元聲明同名的函數extern應該不會改變這一點。

確保你真正建立和鏈接測試程序得當,否則所有你要測試的是,你可以有一個「懸」引用外部符號(在foo功能從2.C參考) 。將2.c編譯爲可執行文件(即鏈接它)應該失敗。

0

編譯應該沒問題。如果你也可以鏈接,你的編譯器有問題。

0

快速測試證實預期接頭失敗(VC++ 2010所明示):引用解析外部符號 「空隙__cdecl FOO(無效)」(FOO @@ YAXXZ):

1> test.obj:錯誤LNK2019在功能_wmain