c++ - 什么时候不需要包含?

标签 c++ include

我承认我在包含方面有点天真。我的理解是,如果您在类里面使用它,则需要包含它或转发声明它。但后来我正在查看一些代码,我看到了这个:

// 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.hC.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/

相关文章:

php - 如何将 PHP 脚本包含在电子邮件正文中

c++ - 是否可以阻止共享/动态库的网络访问?

c++ - OpenGL:使用着色器通过使用预先计算的颜色图来创建顶点照明?

java - 使用 JSP 包含指令、JSP 包含操作和使用 JSP 标记文件包含文件有什么区别?

ruby - Ruby 中的 include 和 extend 有什么区别?

c++ - 如何导入将 [c++] 类导入 [objective-c] 类的 [objective-c++] 类?

javascript - 我在哪里可以找到 cordova.js?

c++ - 你的 C++ 备忘单上有什么?

c++ - 可以优化 C++ 类中引用的存储吗?

C++ 和 - (unsigned int)