避免递归(?)#include声明
Avoid recursive(?) #include declarations
我在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.h
对std::vector
的使用是一个实现细节(并且没有在头中定义的东西的签名中公开(,请考虑将#include <vector>
移动到相应的custom.cpp
文件。
如果你不能把include从custom.h
中移出,比如说,你把一个向量传入或传出一个方法,那么它确实是你接口的一部分,你的头的客户端需要知道它
这是可能的,但这不应该不加考虑,因为它赋予了包含文件的顺序意义,也就是说,根据#includes的顺序,您将无法编译。通常希望避免这种情况。
要实现这一点,请从.h中删除#include <vector>
,并将其添加到上面的Main.cpp中,在其中包含自定义头文件。如果你把它包含在下面,它会抱怨类型没有定义。此外,在每个使用自定义头文件的文件中,它们必须首先使用#include <vector>
。
这个问题几乎是不可避免的。如果您的头文件由于任何原因需要包含另一个头文件,则以后无法"取消包含"它。
有一种技术可以最大限度地减少问题,即皮条习惯用法或不透明指针。通过将类的实现移动到专用源文件中,可以消除最初导致包含头的依赖关系。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 未在作用域中声明unordered_map
- C++避免重复声明的语法是什么
- 如何确保C++函数在定义之前声明(如override关键字)
- 既然存在危险,为什么项目要使用-I include开关
- #include <string> 导致很多'<blank>'尚未声明错误
- 错误/usr/include/string.h:652:42:错误:生成caffe时未在此作用域中声明“memcpy”
- C++:与前向声明类和使用“#include”语句混淆
- 为什么使用前向声明而不是 #include 时会出现不完整的类型
- 如何避免在转发声明导致不完整类型错误时在头文件中 #include
- 如何为头文件声明“#include”以避免“error lnk2005”
- C++中include指令和forward声明之间的区别
- mErrCount:虽然在项目属性的include路径中声明了标识符,但未找到该标识符
- 避免递归(?)#include声明
- 在c++中使用#include访问在其他文件中声明的函数
- C/ c++前向声明vs. Include
- include和forward声明都有错误
- c++ include vs前向声明策略
- 对于c++中大量的私有类常量声明,任何不从另一个文件#include的理由
- 查找include比forward声明更好的用例