2009-01-04 50 views
20

我對頭文件的用法有以下懷疑。使用C++頭文件的最佳做法

1 - 包括警衛意見後,將

/* Copyright Note and licence information (multiple lines) */ 
#ifndef FOO_H 
#define FOO_H 
// Header file contents 
#endif 

香草薩特說,在他的「C++編碼標準」預定像上面的代碼是有問題的。他說「#ifndef」語句應該出現在頭文件的第一行。我沒有覺得這是令人信服的。這是否跟在頭文件中的你們/ gals?

2 - 在頭文件

#ifndef FOO_H 
#define FOO_H 
namespace FooNameSpace{ 
    // Header file contents 
} 
#endif 

使用命名空間採用了正確的做法上面的代碼?我的意思是,你是否在頭文件中使用名稱空間?我知道爲什麼在頭文件中導入一個名字空間是毫無意義的,但是像上面這樣的聲明呢?

如果上面的一個是正確的方法,你如何做一個類在另一個命名空間的「前向聲明」?是像

#ifndef FOO_H 
#define FOO_H 
namespace AnotherNameSpace{ 
    class AnotherFoo; // forward declaration 
} 

namespace FooNameSpace{ 
    // Use AnotherFoo here 
} 
#endif 

的「向前聲明」是爲了避免「循環依賴」的唯一方法,正確嗎?

回答

19
  1. 包括衛兵和評論的順序純粹是一種風格問題 - 它不會對編譯速度產生任何可衡量的影響。

  2. 命名空間絕對應該在頭文件中用於聲明函數,類,全局變量,等等。你應該做的是使用using報表頭文件 - 這是不可能在包括源文件UNUSE東西它,你不應該強迫包括增加額外的東西到全球範圍。如果您需要使用標題中其他名稱空間的內容,請完全限定每個名稱。有時候這可能是一種痛苦,但它確實是正確的做法。

例子:

// WRONG! 
using namespace std; 
class MyClass 
{ 
    string stringVar; 
}; 

// RIGHT 
class MyClass 
{ 
    std::string stringVar; 
}; 

至於在其他命名空間類向前聲明,你就完全正確。請記住,當您在標題中引用AnotherFoo時,請始終符合AnotherNameSpace::AnotherFoo的條件。事實上,前向聲明是打破循環依賴的唯一途徑。

3

關於#1,我沒有意識到有任何具體的論點贊成或反對。許多公司都有一項政策,即版權聲明必須是文件中的第一項內容或任何有意義的代碼(也許假設您會在吸收任何代碼之前閱讀版權)。爲此,#IFNDEF已經是代碼。從可用性的角度來看,將版權置於首位是有道理的,因爲眼睛忽略了它們。然而,在我看來,描述模塊的任​​何東西都應該在#ifndef之後。

2

1)由於評論實際上沒有做任何事情,所以我懷疑這很重要。從技術上講,#include可以複製和粘貼,所以將標題放在標頭警衛之外意味着更多的預處理工作。我不知道大多數編譯器是否足夠聰明來優化它(即,如果它們在預處理器步驟之前刪除了註釋),但是直到達到數以萬計的頭文件時,您可能不會注意到它。

2)這是正確的。如果你想把一個類放入一個名稱空間中,並且該類將在頭文件中聲明,那麼它應該在名稱空間中聲明,因此應該放在頭文件中。是的,這就是你如何前瞻性地宣佈。是的,它是避免循環依賴的主要工具(您也可以更改您的設計,但原則上循環性沒有問題,前提是兩個類只能通過引用或指針相互引用,而不是調用任何方法) 。

7
  1. 我聽說有評論 之前,包括後衛可能會導致一些 編譯器會錯過的 優化。如果守衛是 第一件事,編譯器可能會認出這個習慣用語,甚至不會爲 打開後續包含的標題。在我自己的 代碼中,評論通常在 之前包含警衛。我沒有 困擾測試,看看這是否有 有任何影響或沒有。我可能永遠不會(但如果別人這樣做,我會對結果感興趣)。

  2. 當然標題都應該納入 命名空間 - 否則,沒有什麼 有用的可能永遠是一個 命名空間中。但是,正如你提到的 ,標題不應該 「導入」(爲了更好的詞) 名稱空間到編譯單元 'using'指令。

2
  1. 我不認爲將有評論指出作爲亞當的回答這個帖子任何性能影響。

  2. 我已經在頭文件中使用了自己的名稱空間,如果您定義了自己的字符串類,那麼它會與std名稱空間字符串類發生衝突。

使用「使用」的關鍵字完全是沒有錯的(因爲它給你很多的便利和減少很多您的所有變量前鍵入)

+5

在源文件中,使用「使用」不根本不對,但在頭文件中,這是非常錯誤的。 – 2009-01-04 06:21:48