2013-01-13 120 views
1

在C++中包含文件的最佳位置是什麼?例如:+頭文件,在define塊或文件頂部包含文件

/*Foo.h*/ 
#include <string>  //Should I place this between the #ifndef #endif? 
#include "FooBar.h" 
using namespace std; 

#ifndef Foo_class 
#define Foo_class 
class Foo 
{ 
    /*XXX*/ 
} 
#endif 

/*FooBar.h*/ 
#ifndef FooBar_class 
#define FooBar_class 
class FooBar 
{ 
    /*XXX*/ 
} 
#endif 

/*Foo.cpp*/ 
#include "Foo.h" 
/*XXX*/ 

/*FooBar.cpp*/ 
#include "FooBar.h" 
/*XXX*/ 

我應該將包括的定義,使其只被列入需要的時候?當你不這樣做時,它對系統有影響嗎?

+1

你在那裏做的唯一不好的事情是'使用命名空間標準;'。永遠不要在標題中進行,很少在標題之外進行。 –

回答

3

一般來說,系統頭文件確實可以防範錯誤,包括,所以這真的沒有關係。

+0

謝謝,所以沒有任何性能損失或任何事情。但是對於我來說,從#ifndef開始,當你包含兩個需要彼此的頭文件時,這看起來不錯,但這會導致一個包含循環。或者,在#ifndef開頭還有一個缺點? – Dagob

+1

@Dagob無論如何,我總是把所有內容都放在'#ifdef'中,因爲1.如果偶然的頭部沒有包含警衛,這會捕獲它,2.預處理器不會多餘地工作。 – 2013-01-13 16:13:15

2

庫頭文件已包含自己的#ifdef's,因此如果包含在多個文件中,所有內容都將被解析。所以它沒有關係你放在哪裏。

3
#ifndef Foo_class 
#define Foo_class 

這對應該始終是任何.h文件的第一對行。

如果您包含其他.h文件或包含守護程序的庫文件,它可能無關緊要,但仍然是一個好習慣。

另一個好習慣,在標題中避免using namespace std;

+1

不一定。這只是一個慣例,在這種情況下它沒有實際的區別。也不是每個頭都封裝了一個類。 –

1

最好的地方是在頂部。

只有在有技術理由的情況下才能做與衆不同的事情。

在這種情況下: - 這兩者之間沒有技術上的區別,正如其他答案指出的那樣。 - 我遇到的所有代碼都會將include guard放在頂部。雖然有時候他們在版權聲明之後,但後衛從未在其他#includes之後。

因此:把它放在最上面。

1

在大多數情況下,只要內部包含的文件包含警衛,它就沒有真正的區別。把它放在你認爲最有意義的地方!

但是,有一個約定將它放入#ifndef GUARD中的原因,也就是說,當文件需要很長時間的加載(例如,它們位於負載較重的網絡驅動器或緩慢的磁盤上)時,大項目,同樣的頭文件可以包含在同一個項目中多次

比方說,我們有一個「COMMON.H」:

#include <iostream> 
#include "lesser_common.h" 
#include "not_so_common.h" 

#ifndef COMMON_H 
#define COMMON_H 

... stuff goes here ... 

#endif 
main.c中

,我們有

#include <iostream> 
#incldue "common.h" 
#include "myheader1.h" 
#include "myheader2.h" 
#include "myheader3.h" 

其中myheader {1,2,3} .h也包含common.h。

現在理論上,預處理器必須通讀所有的common.h四次,並且iostream 5次。如果我們移動include guard,那麼當包含common.h時,它不包含其他文件,至少我們保存iostream的三次讀取。對於一個大型的項目來說,包含大量其他文件的文件數量很多[特別是如果您訂閱「在使用此文件之前不需要包含其他文件」原則]],這可以加起來到相當多的文件閱讀。它不應該是你如何/在哪裏安排文件的主要選擇,但記住一點點是個好主意。

話雖如此,大多數預處理器都是「聰明的」,並且瞭解該文件是否第一次在頂部和底部包含警衛,下次不需要讀取頭部。

此外,不包括文件到您的頭文件,除非它是非常需要的是一個非常好的主意 - 當然也適用於源文件。