我有一个包含大量cpp /头文件的代码。我现在的问题是,由于许多彼此包含,所以我偶尔会遇到代码无法编译的情况,除非我在随机文件中对#include
指令重新排序,而现在基本上在创建任何其他头文件时都必须这样做。
这真的很烦人。有什么提示我应该如何编写我的C ++代码以防止#include
引起的并发症?我希望将我的源代码拆分为尽可能多的文件,以便与其他程序员(使用git或svn)的合作更加容易(文件更多==更少的编辑冲突)。
现在,对我有帮助的一件事是前向声明,即当我将其他标头中的类声明到其他文件中时。有时候有帮助,但不能解决所有问题。有时,我只需要更改随机头文件中#include
的顺序或合并多个文件。
最佳答案
不是灵丹妙药,但是以下指南对我有很大帮助。
假设您的代码由类似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
时,它会给您描述的类型带来极大的麻烦。