0

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

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

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

4

1 回答 1

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<<(...);
    ...
}

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

于 2013-09-22T19:04:26.743 回答