2014-01-08 81 views
0

在一個特定的C工程中,文件file1.c使用函數FUNCTION2()。 FUNCTION2()在file2.c中聲明。 FUNCTION2()的extern聲明存在於file1.h中在不包含頭文件的情況下編譯

file1.c只添加file1.h。 在file1.h中,不添加file2.c/file2.h。仍編譯成功,功能正常。

在項目的編譯列表中,先編譯file2.c/file2.h。但是可以在不添加頭文件的情況下調用函數嗎?

+1

標準做法是將FUNCTION2的forward extern聲明放在file2.h中,然後在調用FUNCTION2的所有源文件中放入'#include「file2.h」'或者如果你不想使用頭文件,源文件頂部的外部函數的本地聲明。你真的想做什麼?另一個角度 – selbie

+0

:想想如果你有一天改變file2中的函數會發生什麼,例如其他返回值,那麼您需要檢查所有使用該函數的.c文件,而不是僅更新頭文件file2.h,然後編譯器會告訴修復的位置,而不是從鏈接器獲取未解決的錯誤。 –

回答

2

你可以,但我不會建議。你已經安排好的事情,以強制編譯器開發隱式聲明

int main() 
{ 
    foo(2); /* The compiler emits this by implicit declaration. */  
    return 0; 
} 

int foo(int x) 
{ 
    return x; 
} 

在你明確的情況下,extern告訴編譯器期望foo來自不同的編譯單元。

要做的標準事情是將foo的原型放在標題中幷包含該標題。

相關問題