2014-01-22 72 views
4

我一直在頭文件中使用警衛一段時間,我理解爲什麼他們被使用的唯一原因是在編譯時啓用這個(頭文件有警衛正在考慮中)的單個包含。C頭文件只在頭文件中使用,但不在.c文件中。爲什麼?

我想知道是否有使用頭衛兵的其他任何原因,他們爲什麼沒有在.c文件中使用,如果用於.c文件也衛兵會發生什麼?

Ans。從下面的回覆中收集。

通常所有的定義進入.c文件,並且頭文件(.h文件)包含所有的聲明。包含.c文件不是一個好習慣。

爲了在編譯時只將一個可用於.c文件的聲明與一個翻譯單元相關聯(因此,如果有兩個或多個需要鏈接的庫,即我們有兩個或更多個翻譯單元);標頭守衛幫助包含頭文件ONLY ONCE。

因爲預處理程序階段甚至在編譯文件以獲取對象(.o擴展名)文件之前發生這種情況。預處理器階段替換整個宏,幷包含相關數據,只允許包含一次.h文件。

+0

如果你編寫'#include「foo.h''兩次,那麼內容foo.h將包含兩次。這就是爲什麼你需要守衛。現在假設你寫了「bar.c」,並且你告訴你的構建腳本由於某種原因編譯了兩次。第一次編譯它會生成'bar.o',第二次編譯時它會再次覆蓋'bar.o'。這就是爲什麼你不需要對源文件進行任何防範的原因。 – Brandin

回答

11

什麼守衛在做頭是不是爲了防止在一個項目中的多個包,但只有一個translation unit

例如,假設你有兩個頭文件,a.hb.h。頭文件b.h包括a.h,然後兩者a.hb.h被包括在源文件s.c英寸如果沒有標題保護,文件a.h將包含兩次,這可能會導致錯誤。如果頭文件具有標頭守衛,則文件a.h只能包含一次。

您不需要源文件中的標頭警衛,因爲通常您不需要將其包含在其他文件中的

+0

感謝Joachim的迴應。但是,如果有的話,我需要在.c文件中使用警衛,何時會出現這種情況。 –

+1

@AditYa在真正的初學者圈子之外(其中'#inc'源文件有時很普遍,而不是單獨編譯它們),我所看到的包含源文件的情況非常仔細,因此它們不會被包含在單個翻譯單元,所以不需要標頭警衛。作爲一般規則:不要#include源文件!那麼你不必擔心它。 –

+0

@AditYa如果您決定使用慣例'myheaderfile.c'命名頭文件,那麼您將使用該文件的包含保護。畢竟,名字中的'.c'純粹是一種約定(但顯然是一個好習慣)。 – Brandin

2

標題保護的主要目的,因爲你提到的是爲了避免重複包含。

請看下面的例子

你有你的編譯單元

example_1.h 
example_2.h (includes example_1.h) 

下面的頭文件在 'C' 文件你包括'example_1.h''example_2.h'的聲明(宏)

'#include example_1.h'將執行兩次。

當您添加行

#ifdef EXAMPLE_1 
#define EXAMPLE_1 


#endif 

到example_1.h你告訴你編譯系統,當你encouter的#include example_1.h的第一次,定義一個宏(這個宏是本地到您的構建系統),這表明,我認爲我已經列入example_1.h.The下一次我encouter #include example_1.h我會看到EXAMPLE_1在構建系統 確實定義並跳過。

這個小例子似乎是一件小事,但在包含數百個文件的大型項目中,這確實是一個非常有用的功能。而且由於.c files不會被其他文件包含,所以包含它們並沒有意義在.c files之下。