如何防止包括破损

时间:2013-09-22 18:32:57

标签: c++ include organization

我有一个包含大量cpp / header文件的代码。我现在的问题是,因为很多人互相包含,我偶尔会遇到我的代码无法编译的情况,除非我在随机文件中重新排序#include指令,现在基本上需要创建任何其他指令头文件。

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

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

1 个答案:

答案 0 :(得分:1)

不是灵丹妙药,但以下指南对我有很大帮助。

假设您的代码由MyClassXyz.cpp和相应MyClassXyz.h等文件组成,每个源文件一个类,每个cpp文件应包含相应的头文件 first 。也就是说,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<<(...);
    ...
}

虽然这可以编译好,但是在尝试在其他源文件中使用类MyClassXyz时,它会给您描述的类型带来巨大的麻烦。