关于c ++: 和“include.hpp” 之间的区别

Difference between <include.hpp> and “include.hpp”

本问题已经有最佳答案,请猛点这里访问。

我是C++新手。

使用"和">包含C++头文件有什么不同?

我试图使用一些头文件形成一个开放源码库。该库中的所有头文件都使用<>。现在,当我在头文件中做同样的操作时,它在编译时失败了。


<>首先在头文件的头路径中查找头文件,而"首先在文件的当前目录中查找头文件"。


这种区别在很大程度上是由实现定义的;"..."形式应首先查找包含该文件的文件所在的位置位于;除此之外的<...>号,都在寻找一个实现定义的地点列表,附加要求编译器在任何预期的地方都找不到"..."形式,它重新处理include,就好像它是<...>形式一样。

实际上,我认识的所有编译器都使用-I/I期权,后面跟着一些"标准"和编译器定义的位置。此列表用于<...>;搜索"..."。与include文件在同一目录中,然后作为<...>处理。(至少有些编译器还可以选择添加到列表中"..."

我不知道图书馆发生了什么事。通常情况下,使用第三方库时,必须添加一个或多个-I/I选项告诉编译器在哪里找到头。一次你已经做到了,你的代码和库代码都应该找到必要的收割台。我能想到的一个例子是可能在库头中工作,而不是在您自己的头中,是"..."样式包含在库头中,库头包含在另一个库头,使用路径说明符,例如:

库文件1.hpp:

1
#include"Subdir/LibraryFile2.hpp"

库文件2.hpp:

1
#include"LibraryFile3.hpp"

您将告诉编译器查找头文件(使用EDOCX1[22]选项)在类似于LibraryRoot/include的地方LibraryFile1.hpp所在地;LibraryFile2.hpp与此有关。位置,在LibraryFile2.hpp中,编译器发现LibraryFile3.hpp是因为它与包括它。如果你想直接把LibraryFile3.hpp包括进来,但是,编译器找不到它。


在编译器路径中查找<>之间的文件include,而""相对地查找当前目录(如果指定以/c:\开头的路径,则为绝对路径,但不建议这样做)。

在UNIX系统上,默认情况下,路径包含/usr/include。此路径可以通过添加-Isome_directory来完成,以便它在其中进行搜索。

例如,如果您有文件test.c,并且希望包括include/test.h,那么您有不同的选择:

  • 编写#include"include/test.h",它将相对地从编译文件的目录中查找。

  • 编写#include ,但这次需要向编译器指定-Iinclude,以便将./include目录添加到编译器的路径中。

但是,请注意,有些编译器接受用于查找路径的""符号,但这总是让我困惑,而且是一件糟糕的事情。


<>在默认目录中查找include files,"在当前目录中查找,而不是在默认目录中查找


引号表示从本地文件夹中包含,而<>表示从使用g++或msvc标志或正在使用的任何编译器或系统头指定的其他目录中包含。


这个问题是问题21593的副本。以上答案均不完全正确。与许多程序员一样,我使用了非正式的惯例,即对特定于应用程序的文件使用"myapp.hpp"表单,对库和编译器系统文件使用表单,即/i和include环境变量中指定的文件。但是,C标准规定搜索顺序是特定于实现的。

这是为了您的方便而复制的MSDN解释)。

Quoted form
The preprocessor searches for include files in this order:
1. In the same directory as the file that contains the #include statement.
2. In the directories of the currently opened include files, in the reverse order in which
they were opened. The search begins in the directory of the parent include file and
continues upward through the directories of any grandparent include files.
3. Along the path that's specified by each /I compiler option.
4. Along the paths that are specified by the INCLUDE environment variable.

Angle-bracket form
The preprocessor searches for include files in this order:
1. Along the path that's specified by each /I compiler option.
2. When compiling occurs on the command line, along the paths that are specified by the INCLUDE
environment variable.


包含一个使用<>的文件将告诉编译器在环境定义的包含文件夹中查找这些文件。这些文件夹可以是标准系统文件夹,也可以由makefile定义。如果使用""等,编译器将只在源文件的路径中查找包含文件。因此,您可以使用""并使用绝对路径或与您试图包含的源文件相关的路径,或者在定义包含文件夹后使用<>并只指定要包含的头文件的名称。imho,第二个选项更好,特别是如果您使用大量的头文件或多个库等…

在编译时定义包含文件夹:gcc -I ...(man gcc!)