我有一个包含大量cpp / header文件的代码。我现在的问题是,因为很多人互相包含,我偶尔会遇到我的代码无法编译的情况,除非我在随机文件中重新排序#include
指令,现在基本上需要创建任何其他指令头文件。
这真的很烦人;有什么提示我应该如何编写我的c ++代码以防止#include
出现并发症?我宁愿将我的源代码拆分为尽可能多的文件,以便与其他程序员(使用git或svn)的协作更容易(更多文件= =更少的编辑冲突)。
当我将其他标头中的类声明为其他文件时,现在帮助我的一件事是前向声明。这有时会有所帮助,但并不能解决所有问题;有时我只需要在随机头文件中更改#include
s的顺序或合并多个文件。
答案 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
时,它会给您描述的类型带来巨大的麻烦。