我在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;
没有编译错误,包括矢量标题,我想避免这种情况,任何建议
答案 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。通过将类的实现移动到私有源文件中,可以消除导致您首先包含标头的依赖关系。