我承认我在包含方面有点天真。我的理解是,如果您在类里面使用它,则需要包含它或转发声明它。但后来我正在查看一些代码,我看到了这个:
// file: A.cpp
#include "Helper.h"
#include "B.h"
#include "C.h"
#include "A.h"
// ...
// file: A.h
B b;
C c;
// ...
// file: B.h
Helper h;
// ...
// file: C.h
Helper h;
// ...
有人能给我解释一下为什么B和C不需要包含Helper吗?另外,以这种方式组织包括有哪些优点/缺点? (除了明显少打字。)
谢谢。
最佳答案
当您#include
一些头文件(或其他)到.cpp
文件时,该#include
语句被替换为头文件的内容。例如:
//header.h
int i;
float f;
// file.cpp
#include"header.h"
int main()
{}
在预处理阶段之后,file.cpp 看起来像,
int i;
float f;
int main()
{}
可以在 g++ 中使用 g++ -E file.cpp > TEMP
看到这个,它只显示预处理的文件。
在您当前的问题上下文中,您必须在 B.h
和 C.h
中/之前有 #include
helper.h
> 正如它们之前出现的那样,您声明了这些类型的对象。
另外,依靠头文件的排列来让代码工作并不是一个好习惯,因为一旦你稍微改变排列,整个层次结构就会崩溃并出现几个编译错误。
取而代之的是 #include
文件中的所有内容(如果您正在使用它)并且您可以使用 #ifndef
守卫来避免多重包含:
//helper.h
#ifndef HELPER_H
#define HELPER_H
// content of helper file
#endif
关于c++ - 什么时候不需要包含?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6659570/