2013-02-03 37 views
1

我有三個文件,想編譯它。預處理階段和多個文件(基礎知識)

第一個文件是app.c

#include"sum.h" 
int main (void) 
{ 
    sum(); 
    return 0; 
} 

第二個文件是sum.h

#ifndef SUM_H 
#define SUM_H 
void sum(); 
#endif 

和第三檔sum.c

#include"sum.h" 
void sum() 
{ 
return; 
} 

,我寫這些聲明:

#ifndef SUM_H 
#define SUM_H 
... 
... 
... 
#endif 

防止sum.h內容的多重定義。

在編譯app.c將進入預處理階段,然後進入sum.c預處理階段,我的問題時sum.c進入預處理怎麼知道SUM_H在MYAPP的最後文件中定義的? 我認爲每個源文件分別進入預處理階段和編譯階段。

回答

2

是,每個文件被分開,並因此編譯包括防護裝置僅防止頭文件的多個包含在同一translation unit而不是在不同的翻譯單元

當預編譯器對app.c進行預處理時,只檢查SUM_H是否已在app.c範圍內定義。這避免了sum.h被多次包含在當前翻譯單元中的不同標題中。這是因爲一旦sum.h被包含,一旦SUM_H將被定義。