2013-09-22 43 views
0

我有一个包含大量cpp /头文件的代码。我现在的问题是,因为许多包括对方,我偶尔会陷入我的代码不能编译的情况,除非我用随机文件重新排序#include指令,现在基本上需要创建任何其他头文件。如何防止包含破损

这真的很烦人;有什么建议,我应该如何写我的C++代码,以防止#include并发症?我宁愿将我的源代码分割成尽可能多的文件,以便与其他程序员(使用git或svn)的合作更容易(更多文件==编辑冲突的次数更少)。

现在帮助我的一件事是前向声明,当我将其他头文件中的类声明为其他文件时。这有时会有所帮助,但不能解决所有问题;有时我只需要在随机头文件中更改#include的顺序或合并多个文件。

+1

你在写什么类型的代码,其中#include的*顺序*很重要? –

+0

它是QT gui程序(源代码@ https://github.com/huggle/huggle3-qt-lx) – Petr

+2

如果您需要重新排序,您可能会丢失标头警告或转发声明。或者你的头文件本身并不包括他们需要的东西(尽管试图减少这个前向decls) –

回答

1

不是万能的,但以下指南对我有很大帮助。

假设代码是由文件等MyClassXyz.cpp与对应MyClassXyz.h,每个源文件中的一个类,每CPP-文件应当包括其相应的头文件第一。也就是说,MyClassXyz.cpp必须先从以下行:

// (possibly after comments) 
#include "MyClassXyz.h" 

这确保了MyClassXyz.h包括必要为它编写所有头文件(或前向声明)。

我经常看到使用相反的约定码(#include第一荷兰国际集团最一般的头文件),例如,MyClassXyz.cpp开始与

#include <vector> 
#include <iosfwd> 
#include "blah.h" 
#include "mytypes.h" 
#include "MyClassXyz.h" 

而且MyClassXyz.h“云开门见山”使用已定义的东西附加头:

#pragma once 
// "#include <vector>" missing - a hidden error! 
// "#include <iosfwd>" missing - a hidden error! 
class MyClassXyz 
{ 
    std::vector<int> v; 
    friend std::ostream& operator<<(...); 
    ... 
} 

这枚编译OK,它给你描述的那种巨大的头痛,试图用类MyClassXyz在其他一些源文件时。

+0

首先包含系统头文件的两个优点:(1)它防止用户文件中的宏搞乱系统文件(2)它在预编译头文件中效果更好 –

+0

当然,没有头文件包含他们需要的其他头文件。 –

+0

你认为你可以解释在什么条件下一般的具体标题排序给出了令人头痛的问题?目前还不清楚这将如何改善OP的情况。 –