2011-10-03 5 views
15

私はこのようなファイルをしばらく作成しています: 注文は意味がありますか?名前空間と#includeがスワップされ、なぜそのようになっているかを確認する必要があります。どちらが先ですか?ヘッダーガード、ネームスペースなどを含みます

#ifndef CLASSNAME_H // header guards 
#define CLASSNAME_H 

#include "a.h" // includes in alphabetical order 
#include "b.h" // user specified includes first 
#include "c.h" 
#include <vector> // then library includes 

namespace MyNamespace 
{ 
    class ClassName 
    { 

    }; 
} 

#endif 
+7

ファイルの内容を文字通りあなたのベースファイルにペーストしてから、どの宣言をどの名前空間に入れたいかを考えてみましょう。 –

+0

...異なる.cppファイルに異なる名前空間内に同じヘッダーが含まれているとどうなるか考えてみてください。 –

答えて

10

はい。それはよさそうだ。

私はヘッダーを別々に注文していますが(アルファベット順には問題ありません)

私が変更する唯一のものはインクルードガードです。クラス名だけでなく、名前空間もインクルードします。何回も、私は同じ名前のクラスを持っていますが(異なる名前空間にあります)、同じコードで使用されています。

#ifndef MY_COMPANY_MY_NAME_SPACE_MYCLASSNAME_H // header guards 
#define MY_COMPANY_MY_NAME_SPACE_MYCLASSNAME_H 

#include "a.h" // includes in order of most specific to most general. 

       // My includes first. 
       // Then C++ headers   <vector> 
       //  I group all the containers together. 
       // Then C specific headers <sys/bla.h> 
       // Then C generic headers <ctype.h> 


namespace MyNamespace 
{ 
    Class ClassName 
    { 

    }; 
} 

#endif 
+1

ヘッダーファイル名が一意である場合、インクルードガードに同じ名前を使用するだけで十分です。これは典型的なケースです。異なるディレクトリのインクルードファイルを引っ張っていた場合、同じ名前のファイルが2つある可能性があります。この方法は理にかなっています。 –

+2

このルールの問題は、「より具体的」で「より一般的」である他の開発者と議論する必要があることです。したがって、すべてのインクルードはすべての依存関係を取り出す必要があるため、順序は一般的に無関係であり、アルファベット順は議論を起こさない良い選択です(もちろんプロジェクトヘッダーとシステムヘッダーを分割した後)。 – Juliano

+0

それはあなたが何をしているかによって異なります。アプリケーションで作業している場合は、 のファイル名がすべて一意であることを確認している限り、「MYFILE_H」だけが問題ありません。 'GB_Fallible_hh_20061203izn6Lk4kky3qvxlFVfxSpKam':私のような ものを使用する:あなたは、未知のコンテキストで を使用されるライブラリで作業している場合、あなたは間違いなくそれをより保護することをお勧めします 最後の24の文字がランダムに生成されます('は/ devを使用して/ random')、これは矛盾が不可能であることを意味します。 –

4

あなたが書いたものは完璧です。私はあなたが注文を変更する必要はないと思う。