<include.hpp>和“include.hpp”</include.hpp>之间的区别

时间:2011-09-13 15:09:28

标签: c++ include

我是C ++的新手。

使用“”和&lt;&gt;

包含c ++头文件有什么区别

我正在尝试使用一些开源库中的头文件。该库中的所有头文件都包含在&lt;&gt;中。现在,当我在头文件中执行相同操作时,它在编译时失败。

7 个答案:

答案 0 :(得分:16)

&LT;&GT;首先查找头文件的头文件路径,而“”首先查看头文件的当前目录。

答案 1 :(得分:9)

区别主要是实施定义; "..."表单 应首先查看包含它的文件所在的位置 位于; <...>没有。除此之外,两者都在实现 定义的地点列表,附加要求如果是 编译器在任何预期的位置都找不到"..."形式 将包含重新处理为好像是<...>形式。

在实践中,我所知道的所有编译器都会构建一个使用的地方列表 -I/I选项,后跟一些“标准”和 编译定义的地方。此列表适用于<...>;搜索"..." 在与包含文件相同的目录中,然后将其视为<...>。 (至少一些编译器也可以选择添加到列表中 "..."。)

我不确定图书馆发生了什么。一般, 使用第三方库时,您必须添加一个或多个-I/I选项告诉编译器在哪里找到它的头。一旦 你已经完成了,你的代码和库代码都应该找到所有 必要的标题。我能想到的一个案例包括 可能在库头中工作,而不是在你自己的头文件中,是一个 "..."样式包含在包含的库头中 另一个库头,使用路径说明符,例如:

LibraryFile1.hpp:

#include "Subdir/LibraryFile2.hpp"

LibraryFile2.hpp:

#include "LibraryFile3.hpp"

您将告诉编译器查找标题(使用-I 选项)像LibraryRoot/include这样的地方 LibraryFile1.hpp位于; LibraryFile2.hpp与此相关 位置,并在LibraryFile2.hpp中,编译器找到 LibraryFile3.hpp因为它与文件位于同一目录中 包括它。如果您尝试直接包含LibraryFile3.hpp, 但是,编译器不会找到它。

答案 2 :(得分:4)

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

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

例如,如果您有文件-Isome_directory并且想要包含test.c,那么您有不同的选择:

  • include/test.h,它看起来相对于编译文件的目录。

  • #include "include/test.h",但这次你需要为编译器指定#include <test.h>,将-Iinclude目录添加到编译器的路径中。

但请注意,某些编译器在路径中接受./include符号表示查找,但这总是让我感到困惑,这是一件坏事。

答案 3 :(得分:2)

引号表示包含本地文件夹和&lt;&gt;意味着要包含从使用g ++或MSVC标志指定的另一个目录或您使用的任何编译器或系统头文件。

答案 4 :(得分:2)

&LT;&GT;在默认目录中查找包含文件,“”查找当前目录而不是默认目录

答案 5 :(得分:1)

此问题与Question 21593重复。上述答案都不完全正确。像许多程序员一样,我使用了“myApp.hpp”表单的非正式约定,用于特定于应用程序的文件,以及库和编译器系统文件的表单,即/ I和INCLUDE环境变量中指定的文件。但是,C标准规定搜索顺序是特定于实现的。

以下是为方便起见而复制的msdn explanation

  

引用表格      预处理器按此顺序搜索包含文件:
     1.与包含#include语句的文件位于同一目录中      2.在当前打开的包含文件的目录中,按照相反的顺序         他们被打开了。搜索从父包含文件的目录开始,然后是         继续向上通过任何祖父母包含文件的目录      3.沿着每个/ I编译器选项指定的路径      4.沿着INCLUDE环境变量指定的路径。

     

角括号表单
    预处理器按此顺序搜索包含文件:
    1.沿着每个/ I编译器选项指定的路径     2.在命令行上进行编译时,沿着INCLUDE指定的路径进行编译        环境变量。

答案 6 :(得分:0)

使用<>包含文件将告诉编译器在环境定义的包含文件夹中查找这些文件。这些文件夹可以是标准系统文件夹,也可以是Makefile定义的文件夹,等等。使用"",编译器只会在源文件的路径中查找包含文件。
因此,您可以使用""并使用绝对路径或相对于您尝试包含的源文件的路径,或者您可以在定义包含文件夹后使用<>,并指定名称要包含的头文件 恕我直言,第二个选项更好,特别是如果你使用很多标题,或多个库等...

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

相关问题