避免递归(?)#include声明

时间:2011-12-02 20:53:47

标签: c++ header

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

#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;

没有编译错误,包括矢量标题,我想避免这种情况,任何建议

3 个答案:

答案 0 :(得分:5)

如果custom.h使用std::vector是一个实现细节(并且未在标题中定义的内容的签名中公开),请考虑将#include <vector>移至相应的{而是{1}}文件。

如果您无法移动custom.cpp中的包含,因为您将一个向量传入或传出方法,那么它确实是您的界面的一部分,并且您的标题的客户端需要知道关于它。

答案 1 :(得分:0)

有可能,但是这不应该在没有考虑的情况下完成,因为它赋予您包含文件的顺序的含义,也就是说,您将会或者将无法编译,具体取决于你的#includes的顺序是什么。通常希望避免这种情况。

要完成此操作,请从.h中删除#include <vector>并将其添加到上面包含自定义头文件的上面的 。如果你在下面#include它,它会抱怨未定义的类型。此外,在使用自定义标头文件的每个文件中,他们必须先#include <vector>

答案 2 :(得分:0)

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

有一种技术可以将问题最小化pimpl idiom or opaque pointer。通过将类的实现移动到私有源文件中,可以消除导致您首先包含标头的依赖关系。