Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ #包含已包含的头文件中包含的头文件是否是常见做法?_C++_C_Dependencies_Include_Dependency Management - Fatal编程技术网

C++ #包含已包含的头文件中包含的头文件是否是常见做法?

C++ #包含已包含的头文件中包含的头文件是否是常见做法?,c++,c,dependencies,include,dependency-management,C++,C,Dependencies,Include,Dependency Management,假设我们有一个头文件a.h,它取决于B.h和C.h中声明的内容B.h还依赖于C.h,因此包括它。 在这种情况下,我们不需要在A.h中包含C.h,如果没有它,它就可以正常编译 但我想知道在这些情况下,最好的做法是什么。如果B.h发生了某种变化,不再依赖于C.h,A.h将中断 另一方面,如果我把这一点考虑到底,那么重新包含每个依赖项似乎是不必要的/不切实际的 我有一个常见的例子是标准库。在几乎所有的头文件中,我都必须包含和。我经常跳过这一点,因为它们已经包含在一个依赖项中,但这总感觉有点随意 如果B

假设我们有一个头文件
a.h
,它取决于
B.h
C.h
中声明的内容
B.h
还依赖于
C.h
,因此包括它。 在这种情况下,我们不需要在
A.h
中包含
C.h
,如果没有它,它就可以正常编译

但我想知道在这些情况下,最好的做法是什么。如果
B.h
发生了某种变化,不再依赖于
C.h
A.h
将中断

另一方面,如果我把这一点考虑到底,那么重新包含每个依赖项似乎是不必要的/不切实际的

我有一个常见的例子是标准库。在几乎所有的头文件中,我都必须包含
。我经常跳过这一点,因为它们已经包含在一个依赖项中,但这总感觉有点随意

如果B.h以某种方式改变,不再依赖于C.h,A.h将崩溃

没错。为什么要冒险

另一方面,如果我把这一点考虑到底,那么重新包含每个依赖项似乎是不必要的/不切实际的

如果不可行,则文件的依赖项太多,可能太大

将其重构为更小的模块

我有一个常见的例子是标准库。在几乎所有的头文件中,我都必须包含
。我经常跳过这一点,因为它们已经包含在一个依赖项中,但这总感觉有点随意

我承认,有时当我知道我的一个头(明确定义为将我需要的类型引入范围)已经完成了这项工作时,我会跳过这些。它不太可能被重构,因为它有这些头是因为这个原因,而不是因为其他一些可能消失的依赖关系


但归根结底,在需要的地方加入
并没有什么错。老实说,我很惊讶您发现“几乎所有[您的]头文件”中都需要它们。

我建议的常见做法和经验法则是,所有头文件都应该是自包含的

换句话说,如果
A.h
中的某个东西只有在
B.h
#include
d时才能编译,那么
A.h
应该
#包括“B.h”
。这避免了在需要使用
A.h
时强制执行其他代码

#include "B.h"
#include "A.h"
这是递归的。每个包含的文件都应该是自包含的。它也适用于您的标题,包括标准标题

为了解决标题多次被包含的潜在问题,标题中也应使用包含防护装置


就像任何经验法则一样,在某些情况下它并不适用。但是这些在实践中相对不常见。

对于使用include-guard的正确编写的标题,间接包含多少次并不重要。尽管如此,通过前向声明,您通常可以在大多数情况下减少依赖项。如果文件依赖于头文件中的符号,则应直接包含头文件,而不依赖间接包含的头文件。包含您使用的内容:相关:BP不应该在.cpp中包含内容并在头文件中使用正向引用吗?(除非你那里有实际的代码)@Narase如果可能的话,当然可以。我想OP是在讨论必要的标题。