2013-11-21 48 views
1

守衛我已經看到這樣的代碼通常是在源文件的開始用C目的包括在.c文件

#ifndef _INCLUDE_GUARDS_C 
#define _INCLUDE_GUARDS_C 

main() 
{ 

} 

function1() 
{ 
} 

#endif 

function2() 
{ 
} 

我感到困惑的這個目的..?

我知道如果包括警衛在頭文件定義,但

  1. 什麼的這些目的包括在源文件中後衛?和

  2. 爲什麼function2()被定義在include guard之外?

+0

http://en.wikipedia.org/wiki/Include_guard –

+1

在源文件(.c)中請求這些警衛的目的而不是頭文件(.h) – user2798118

+0

沒有任何東西阻止您將來自其他源的源文件文件,除了增加你獲得P45的可能性外。在這種情況下可以使用多個包容性警衛。 – Bathsheba

回答

5

在C或C++非頭文件源文件中放入include guard沒有任何好處。

我已經從零開始實施了一個預處理器,並研究了包括關於一個人可以這樣做的警衛,而這完全沒有意義。

至於守衛之外的功能,對我來說看起來就像sl iness。或者,有時當某人有魔法咒語時,他們不確定什麼時候它應該適用,所以他們隨機應用。

+0

我沒有實現預處理器,也沒有學習過守衛,但我仍然可以告訴你,在源文件中使用守衛是毫無意義的(除非你#包含源文件,在這種情況下,我有更強的話) 。 – mah

+0

@mah在這裏似乎沒有比權威更好的爭論,而且沒有其他任何答案可以從評論中分離出來。 – Potatoswatter

+0

我並沒有對你發佈的答案(或者你發佈的答案而不是評論)表達任何擔憂......我只是說在這種情況下,權威並不覺得特別有用。以類比的方式去誇張,如果你告訴我從3層建築中掉落一塊西瓜會導致它撞擊,我不需要聽到你的物理學位以相信你......我會你在你的話:) – mah

0

老問題,但...

我認爲它可以在測試代碼時使用。測試時,您需要訪問標題中未定義的本地功能,因此您需要包含.c文件...是的,這很醜陋。是的,你有better options

對於沒有在標題中定義的函數,您不需要包含保護。