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

问题描述 投票:0回答:1

我正在学习 C++ 编程,我正在制作一个包含头文件(我们称之为 functions.h)的 main.cpp。现在,如果我在 functions.cpp 中包含一些库,我是否必须再次将它们包含在 main.cpp 中或者没有必要?

我知道当我包含一个头文件时,我会自动包含该头文件包含的所有库。但是它的 .cpp 文件也会发生这种情况吗?

c++ c-preprocessor
1个回答
1
投票

您可能想要将

#include
指令插入任何
.cpp
.h
文件的原因是因为您知道稍后在同一文件中有代码不会编译,除非编译器首先解析了存在的声明在你
#include
-d.

的文件里面

例如,如果您知道

main.cpp
将调用
std::cout << "Hello"
,那么您将希望
#include <iostream>
main.cpp
的顶部,这样编译器就不会因
undeclared identifier 'std::cout'
错误而出错当它到达
main.cpp
.

中的那行代码时

由于每个

.cpp
文件都是单独编译的,因此您需要确保每个需要它们的 .cpp 文件中都存在正确的
#include
指令。例如,如果您的 functions.cpp 文件中有
also
代码引用了
std::cout
,那么您的
functions.cpp
文件应该 also 在其顶部有一个
#include <iostream>

让事情稍微复杂一点的是要在您自己的

.h
文件顶部插入哪些包含指令的问题。例如,如果您的
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
取决于你 - 有支持和反对它的论据。

请注意,在某些情况下,您可以通过在头文件中放置前向声明来避免在头文件中放置

#include
,例如:

// in functions.h

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

void PrintToStream(Foo & s);

这会编译,因为为了解析函数声明,编译器只需要知道一个名为

Foo
exists的类,它不需要知道它是如何工作的,而且编译速度会更快而不是编译器必须读入并解析整个
Foo.h
头文件。然而,任何实际使用
Foo
对象的代码(而不是仅仅提到名字
Foo
)仍然需要做完整的
#include "Foo.h"
。特别是,在对象上调用方法、声明对象或对对象进行指针数学运算都需要知道对象的大小,这是前向声明所不提供的。

© www.soinside.com 2019 - 2024. All rights reserved.