c++ 如果我的main.cpp包含一个头文件,而这个头文件的.cpp包含了这些库,我是否必须在main.cpp中包含这些库?

lokaqttq  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(119)

我正在学习c++编程,我正在编写一个包含头文件(我们称之为functions.h)的main.cpp。现在,如果在functions.cpp中包含一些库,我是否必须在main.cpp中再次包含它们?
我知道当我包含一个头文件时,我会自动包含该头文件包含的所有库。但是它的.cpp文件也会这样吗?

z9zf31ra

z9zf31ra1#

您可能希望将#include指令插入到任何.cpp.h文件中的原因是,您知道在同一文件中稍后有代码无法编译,除非编译器首先解析了您#include-d文件中的声明。
例如,如果你知道main.cpp将调用std::cout << "Hello",那么你会想在main.cpp的顶部调用#include <iostream>,这样当编译器到达main.cpp中的那行代码时,它就不会错误地输出undeclared identifier 'std::cout'错误。
由于每个.cpp文件都是单独编译的,因此您需要确保每个.cpp文件中都有正确的#include指令。例如,如果functions.cpp文件中有 also 代码引用std::cout,则functions.cpp文件的顶部 also 应该有#include <iostream>
让事情变得有点复杂的是,在你自己的.h文件的顶部插入哪个include-directives。例如,如果你的functions.h文件有一个这样的声明:

void DoSomethingWithAFooObject(Foo & s);

...然后你会想把 something 放在functions.h的顶部附近,这样当编译器遇到这个声明时,它就不会出错,因为它不知道Foo是什么。假设你没有直接在这个头文件中声明class Foo {...},那么放在functions.h顶部的明显的东西是例如#include "Foo.h"(或者任何声明了class Foo {...}的头文件),因为这将拉入编译器需要的定义。这样做的副作用是,任何.cpp文件,#include您的functions.h现在也将隐式地#include-ing Foo.h作为副作用;您是希望依赖于这种间接包含,还是将#includes同时保留在.h.cpp文件中,这取决于您--对此有赞成和反对的意见。
请注意,在某些情况下,您可以通过在头文件中放置一个forward-declaration来避免在头文件中放置#include,例如:

// in functions.h

class Foo;  // forward declaration -- tells the compiler that a class named Foo exists

void PrintToStream(Foo & s);

这将编译,因为为了解析函数声明,编译器只需要知道一个名为Foo * 的类存在 *,它不需要知道关于它如何工作的任何事情,而且它将编译得比编译器必须读入并解析整个Foo.h头文件更快。任何实际使用Foo对象的代码(相对于只提到名称Foo)仍然需要执行完整的#include "Foo.h"。特别是,调用对象上的方法,声明对象,或者对一个对象进行指针运算都需要知道对象的大小,而这是前向声明所不能提供的。

相关问题