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逻辑保留在它所属的位置:)