如何防止内含破损

How do I prevent include breakage

本文关键字:何防止      更新时间:2023-10-16

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

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

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

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

假设您的代码由具有相应MyClassXyz.hMyClassXyz.cpp等文件组成,每个源文件一个类,每个 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时,它会给您描述的类型带来巨大的麻烦。