C++ 如何包含头文件

C++ 如何包含头文件,c++,header-files,C++,Header Files,我如何导入头文件重要吗?我见过双引号和箭头 #include <stdlib.h> #include "Some_Header.h" 在two.cpp中: class SomethingElse { Something *example; ... 像那样?在爪哇,你只需在C++中用“Pube”来序列化一个类名,RangRangle类看起来就有点困难了。 < P>角括号在系统头目录中查找标题(例如:代码>/Ur/Ipule)。引号只是一个绝对或相对路径名,例如/pa

我如何导入头文件重要吗?我见过双引号和箭头

#include <stdlib.h>
#include "Some_Header.h"
在two.cpp中:

class SomethingElse {
    Something *example;
    ...

像那样?在爪哇,你只需在C++中用“Pube”来序列化一个类名,RangRangle类看起来就有点困难了。

< P>角括号在系统头目录中查找标题(例如:代码>/Ur/Ipule)。引号只是一个绝对或相对路径名,例如
/path/to/header.h
。/headers/abc.h


要从其他文件访问类,只需将另一个文件包含在类中即可。请确保对程序进行结构化,以便不会多次包含任何文件。

问题1

我如何导入标题重要吗 文件夹? 它们是否资本化有关系吗 还有某种方式吗


没关系,但通常的做法是

  • 在系统中使用尖括号 标题
  • 用户的双引号 定义的标题(您自己的标题)
问题2和3

另一个问题是,(来自Java) 在这里),我如何访问外部的类 在其中定义它的文件

您需要将类定义放置在头文件中,并将该头文件包含在您希望使用该类的任何位置。 对于您的情况,它将如下所示

//One.h
#ifndef ONE_H
#define ONE_H
class Something
{
public:
    void doSomething(){}

};
#endif

//Two.cpp
#include "One.h"
class SomethingElse
{
   SomeThing *example;
};
#include
指令中的尖括号表示搜索路径仅限于“系统”包含目录。双引号表示搜索路径包含当前目录,后跟系统包含目录


当操作系统使用区分大小写的文件系统时,文件名的大小写很重要。听起来您可能正在使用Windows或Mac OS X,默认情况下文件名不区分大小写。

首先问一个简单的问题:

如果它们也以某种方式资本化,这有关系吗

在大多数情况下,
包含
引用文件,编译器应该能够找到系统中包含的文件。因此,在文件系统区分大小写的所有系统中,大小写都很重要。如果您想保持最低限度的可移植性,您应该在文件名和
包含的
中保持一致。(默认情况下,所有linux和mac操作系统都有区分大小写的文件系统,在windows中,您也可以将NTFS配置为区分大小写)

现在,文件的命名方式真的很重要吗?不,不需要,只要你在包裹中保持一致。还要注意的是,建议遵循一种模式以简化包含

我如何导入头文件重要吗

标准在这一点上并不明确,不同的实现遵循不同的路径。该标准定义它们可能不同,因为编译器搜索包含文件的位置和顺序集是实现定义的,如果包含是尖括号或双引号,则可能不同。如果带引号的include无法定位文件,编译器必须退回来处理include,就像它是用尖括号编写的一样

#include <x.h> // search in order in set1 of directories
#include "x.h" // search in order in set2 of directories
               // if search fails, search also in set1
#包括//在目录集合1中按顺序搜索
#在目录集合2中按顺序包括“x.h”//search
//如果搜索失败,也在set1中搜索
这意味着,如果一个文件只存在于set1中,两种类型的include都会找到它。如果文件存在于set2中,而不是set1中,则只有quote include将定位该文件。如果set1和set2中存在同名的不同文件,则每个包含类型将查找并包含不同的文件。如果set1和set2的公共子集中存在两个同名文件,但集合的顺序不同,则每个包含类型可以定位不同的文件

回到现实世界,大多数编译器将只在set2中包含当前目录,而set1是所有系统包含位置(通常可以使用编译器参数进行扩展)。在这些情况下,如果文件仅存在于当前目录中,
#include“a.h”
将找到它,但
#include
不会

现在,无论这是否是常见的行为,都有一些隐含的语义在C/C++中是惯用的。通常,方括号用于包含系统头和外部头,而双引号用于包含本地文件。对于同一项目中的图书馆应被视为本地图书馆还是外部图书馆,存在一个灰色地带。也就是说,即使总是包含双引号也可以,大多数人也会使用角引号来引用不属于当前模块的标题

最后,虽然据我所知,没有编译器能做到这一点,但该标准允许实现(编译器)不将标准头生成为真实文件,而是在内部处理标准头的包含。这是理论上
#include“vector”
无法包含
std::vector
类(或任何其他标准标题)定义的唯一情况。但这不是一个实际问题,我认为它永远不会。

< P>首先, >代码包含是C预处理器指令,而不是严格的C++语言的一部分。您可以找到更多关于它的信息,尽管这是专门针对GNUC预处理器的,因此可能与您正在使用的有所不同。我认为在include文件中应该始终假定区分大小写。不这样做可能会使您很难将代码移植到区分大小写的操作系统,如UNIX

正如上面所解释的,使用“”或是相当微妙的,大多数时候你会注意到没有区别。使用“”通常首先搜索当前目录。我倾向于不将此用作:

  • 我知道我的头在哪里-我总是在编译行上用
    -I
    指定它们
  • 我曾经被发现,当一个标题的本地bodded副本覆盖了我希望获取的中心副本时
我也注意到一些副作用
#include <x.h> // search in order in set1 of directories
#include "x.h" // search in order in set2 of directories
               // if search fails, search also in set1