我是C ++的新手。
使用“”和<>
包含c ++头文件有什么区别我正在尝试使用一些开源库中的头文件。该库中的所有头文件都包含在<>中。现在,当我在头文件中执行相同操作时,它在编译时失败。
答案 0 :(得分:16)
<>首先查找头文件的头文件路径,而“”首先查看头文件的当前目录。
答案 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!)