2011-10-03 58 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

你写的是完美的。我不认为你需要改变顺序。