當我們想在我的Main.c
中使用File1.c
中的void foo(void)
函數時[我的主函數是] - 爲什麼我不需要寫:爲什麼main不被聲明爲extern
extern int main(void);
File1.c
?
假設
File1.c
和Main.c
在單個TU中。
當我們想在我的Main.c
中使用File1.c
中的void foo(void)
函數時[我的主函數是] - 爲什麼我不需要寫:爲什麼main不被聲明爲extern
extern int main(void);
File1.c
?
假設
File1.c
和Main.c
在單個TU中。
你永遠不需要寫函數聲明extern
。功能默認具有外部鏈接。在一些較舊的代碼中觀察到一種奇怪的無法解釋的習慣:將extern
添加到所有外部函數聲明中。 (這可能是導致你對main
問題的原因。)實際上,這是完全沒有必要的,不起任何作用,只會混淆代碼。
如果您願意,您可以肯定地聲明main
與extern
。但它是完全多餘的。
因爲在作爲執行起點的可執行文件的整個部分中只需要一個main
。每個翻譯單位不需要鏈接到main
。由C
報價++標準(我認爲這將是對C相同的情況下也是如此) -
ISO/IEC 14882:2003(E)3.6.1
3 ... ]主要的鏈接(3.5)是實現定義的 。 [...]
首先,功能默認爲extern
。
此外,main
是「特殊的」;鏈接器以不同的方式對待它。
「假設File1.c和Main.c在單個TU中」 - 這是什麼意思?在'#include's被處理後,TU是一個源文件。唯一的方法'File1.c'和'Main.c'可以在一個單獨的TU中,如果其中一個'#包含'另一個,或者它們都來自其他文件'#include'd。 –
@Steve Jessop - 我認爲你在這裏混合了一點......我們可以在TU中編譯2個源文件,而不必一定包含它......我們只需要將它們傳遞給編譯器......我只是試了一下確保....如果有任何要求,您只需要包含頭文件,我們不會包含源文件 - 在編譯時其他方面,他們將進入文件範圍! –
C99標準5.1.1.1/1:「一個源文件以及通過預處理指令#include包含的所有頭文件和源文件被稱爲預處理翻譯單元,預處理翻譯單元經過預處理後稱爲翻譯單元」 。我認爲你的意思是TU(一個可執行文件,也許是一個靜態庫)以外的其他東西,但TU並不適合它。 –