避免递归(?)#include声明

Avoid recursive(?) #include declarations

本文关键字:#include 声明 递归      更新时间:2023-10-16

我在c++项目中使用一个自定义库,它包含了几个std头,但当我在主文件中包含相应的头时,就像我在自定义文件中包含了所有的头一样
需要明确的是:
自定义头文件:

#ifndef CUSTOM_H
#define CUSTOM_H
#include <vector>
//stuff
#endif

Main.cpp:

#include <iostream>
#include "custom.h"
//here, let suppose that i do next:
vector<int> vec;
return 0;

没有编译错误,就像包含了向量头一样,我想避免这种情况,任何建议

如果custom.hstd::vector的使用是一个实现细节(并且没有在头中定义的东西的签名中公开(,请考虑将#include <vector>移动到相应的custom.cpp文件。

如果你不能把include从custom.h中移出,比如说,你把一个向量传入或传出一个方法,那么它确实是你接口的一部分,你的头的客户端需要知道它

这是可能的,但这不应该不加考虑,因为它赋予了包含文件的顺序意义,也就是说,根据#includes的顺序,您将无法编译。通常希望避免这种情况。

要实现这一点,请从.h中删除#include <vector>,并将其添加到上面的Main.cpp中,在其中包含自定义头文件。如果你把它包含在下面,它会抱怨类型没有定义。此外,在每个使用自定义头文件的文件中,它们必须首先使用#include <vector>

这个问题几乎是不可避免的。如果您的头文件由于任何原因需要包含另一个头文件,则以后无法"取消包含"它。

有一种技术可以最大限度地减少问题,即皮条习惯用法或不透明指针。通过将类的实现移动到专用源文件中,可以消除最初导致包含头的依赖关系。