2011-09-19 92 views
3

當我們想在我的Main.c中使用File1.c中的void foo(void)函數時[我的主函數是] - 爲什麼我不需要寫:爲什麼main不被聲明爲extern

extern int main(void);

File1.c

假設File1.cMain.c在單個TU中。

+2

「假設File1.c和Main.c在單個TU中」 - 這是什麼意思?在'#include's被處理後,TU是一個源文件。唯一的方法'File1.c'和'Main.c'可以在一個單獨的TU中,如果其中一個'#包含'另一個,或者它們都來自其他文件'#include'd。 –

+0

@Steve Jessop - 我認爲你在這裏混合了一點......我們可以在TU中編譯2個源文件,而不必一定包含它......我們只需要將它們傳遞給編譯器......我只是試了一下確保....如果有任何要求,您只需要包含頭文件,我們不會包含源文件 - 在編譯時其他方面,他們將進入文件範圍! –

+1

C99標準5.1.1.1/1:「一個源文件以及通過預處理指令#include包含的所有頭文件和源文件被稱爲預處理翻譯單元,預處理翻譯單元經過預處理後稱爲翻譯單元」 。我認爲你的意思是TU(一個可執行文件,也許是一個靜態庫)以外的其他東西,但TU並不適合它。 –

回答

5

你永遠不需要寫函數聲明extern。功能默認具有外部鏈接。在一些較舊的代碼中觀察到一種奇怪的無法解釋的習慣:將extern添加到所有外部函數聲明中。 (這可能是導致你對main問題的原因。)實際上,這是完全沒有必要的,不起任何作用,只會混淆代碼。

如果您願意,您可以肯定地聲明mainextern。但它是完全多餘的。

1

因爲在作爲執行起點的可執行文件的整個部分中只需要一個main。每個翻譯單位不需要鏈接到main。由C

報價++標準(我認爲這將是對C相同的情況下也是如此) -

ISO/IEC 14882:2003(E)3.6.1

3 ... ]主要的鏈接(3.5)是實現定義的 。 [...]

4

首先,功能默認爲extern

此外,main是「特殊的」;鏈接器以不同的方式對待它。

相關問題