C++ 如何在C&x2B中包含工作+;?

C++ 如何在C&x2B中包含工作+;?,c++,include,C++,Include,如果一个库包含在一个类标题中,而这个标题包含在另一个类中,那么我必须再次包含该库吗 例如: #ifndef A_H #define A_H #include<someLibrary.h> class A{ ... } #endif \ifndef A\u H #定义一个 #包括 甲级{ ... } #恩迪夫 然后另一个类包括A.h头 #include<A.h> //include class A class B{ ... } #包括//包括A类

如果一个库包含在一个类标题中,而这个标题包含在另一个类中,那么我必须再次包含该库吗

例如:

#ifndef A_H
#define A_H

#include<someLibrary.h>

class A{
  ...
}

#endif
\ifndef A\u H
#定义一个
#包括
甲级{
...
}
#恩迪夫
然后另一个类包括A.h头

#include<A.h>   //include class A
class B{
   ...
}
#包括//包括A类
B类{
...
}

我必须在类B中包含“someLibrary.h”吗?

您不包括类或库,只包括标题,这是一个文本操作(有点像预处理器完成的复制和粘贴)

请阅读有关的更多信息,以及

您可以要求编译器向您显示源文件
foo.cc
的预处理表单,例如使用
g++-Wall-C-e foo.cc
(它将溢出到预处理表单的标准部分)

对于一个小项目(例如,小于200KLOC),所有翻译单元只包含一个通用头文件是明智的(我认为有许多小头文件是坏习惯,所以我通常在每个头文件中放置多个类定义)。顺便说一句,这种(单头文件)方法对用户很友好。有些人喜欢在单个标题中包含几个自己的
#include
-d子标题

<>注意,大多数C++标准头(如<代码> <代码>或<代码> <代码>…)带来大量文本,因此,您不希望有小型编译单元(在我的Linux系统中,<>代码>包含< /COD>拖动超过一万行,因此在编译后效率低下的源代码行只有几十个)

还注意到C++类定义通常有很多内联成员函数(实际上,您想在同一个头文件中给出该内联函数的主体)。所以C++头代码往往比较大…… (有些人喜欢将一个头文件分成多个子标题,这些子标题总是包含在一起)

不,
#include
是可传递的

但是,如果您的第二个文件本身使用来自某个库的符号,则重新包含头是一种很好的样式。这样你就不会“希望并祈祷”你永远不会移除中间包。如果每个源文件都包含它直接需要的所有内容,那么您的代码库将更加健壮。页眉保护可以防止这是一个浪费的策略。

include指令完全按照名称的意思执行,它实际上包括指令所在位置的文件

简单示例:假设我们必须创建文件,首先是名为
a.h

// Our class
class A
{
    // Stuff for the class
};
// End of the class
然后是一个源文件
a.cpp

// Include header file
#include "a.h"
// Header file included

int main()
{
    // Code
}
预处理器生成一个文件,看起来像

// Include header file
// Our class
class A
{
    // Stuff for the class
};
// End of the class
// Header file included

int main()
{
    // Code
}
此包含是递归的,因此如果一个头文件包含另一个头文件,则该头文件也将包含在内

预处理器生成的源文件称为a,是编译器实际看到的


以上是对现代预处理器工作方式的简化,虽然可以单独运行以创建预处理的源文件,但更常见的是,预处理器是编译器的一部分,以简化解析过程


您还应该注意,您使用的术语不正确。库可以(通常也可以)有一个或多个头文件,在编译源代码时使用这些头文件。然后,库通常(但不总是)包含一个特殊的库文件,该文件与编译器创建的对象文件链接


没有链接器库的库称为仅标题库。

是否使用
中的任何内容(即直接使用而不是通过
A
)?如果是这样的话,那么是的,“包含您使用的内容”-它使代码库对包含更改更加健壮。Youtuber告诉编译器将复制并粘贴.h文件的内容,并将其粘贴到您的.cpp文件中。在这种情况下,您可以查看是否需要包含您的内容。”对于一个小项目(例如,小于200KLOC),所有翻译单元只包含一个通用头文件是明智的“o”。O@PreferenceBean:上面的
o.o
是什么意思?“这种(单头文件)方法对预编译头很友好”虽然从技术上讲是正确的,但预编译头的惯用方法(至少我是这么认为的)不是让它们污染您的代码库,而是使用命令行参数[有条件地]包含庞然大物头(并让头保护在代码中省略实际的
#include
s)。这允许您将构建系统中的所有PCH逻辑保留在它所属的位置:)