2011-10-03 33 views
15

我一直在製作這樣的文件一段時間: 命令是否有意義?或者應該將名稱空間和#includes交換以及爲什麼。哪個先到?頭部衛士,命名空間和包括

#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

想象一下,'#include'將文件內容從字面上粘貼到您的基本文件中,然後計算出您想要哪些命名空間具有哪些聲明。 –

+0

...並考慮如果不同的.cpp文件在不同的名稱空間中包含相同的頭文件會發生什麼...... –

回答

10

是的。這看起來不錯。

雖然我命令我的標題不同(但按字母順序很好)。

我會改變的唯一的事情就是包括後衛。我將包括我的namspace以及類名。多次,我有相同的代碼使用相同的名稱(但在不同的名稱空間)的類。

#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

這條規則的問題在於,你必須與其他開發者爭論,其中包括「更具體」和「更一般」。因此,由於每個包含都應該取消它的所有依賴關係,所以順序通常是不相關的,並且字母順序是一個不引起討論的好選擇(當然,在你拆分項目和系統頭部之後)。 – Juliano

+0

這取決於你在做什麼。如果你正在使用應用程序, 只要'MYFILE_H'應該沒問題,只要你確保所有的 文件名都是唯一的。如果你正在使用一個在未知上下文中使用的庫,你一定會想要更多地保護它:我使用 ,例如:'GB_Fallible_hh_20061203izn6Lk4kky3qvxlFVfxSpKam': 最後24個字符是隨機生成的(使用'/ dev/random'),其中 意味着衝突是不可能的。 –

4

你寫的是完美的。我不認爲你需要改變順序。