不是灵丹妙药,但以下指南对我有很大帮助。
假设您的代码由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
在其他源文件中使用该类时,它会给您描述的类型带来巨大的麻烦。