在 C++ 中包含头文件时尖括号 < > 和双引号“”之间的区别? [复制]

Posted

技术标签:

【中文标题】在 C++ 中包含头文件时尖括号 < > 和双引号“”之间的区别? [复制]【英文标题】:Difference between angle bracket < > and double quotes " " while including header files in C++? [duplicate] 【发布时间】:2011-03-10 20:59:21 【问题描述】:

可能重复:What is the difference between #include <filename> and #include “filename”?

在 C++ 中包含头文件时,尖括号 &lt; &gt; 和双引号 " " 有什么区别?

我的意思是应该包含哪些文件,例如:#include &lt;QPushButton&gt;,哪些文件应该包含,例如:#include "MyFile.h"???

【问题讨论】:

这是 ***.com/questions/21593/… 的完全相同的副本,尽管最重要的答案是错误的(它确实与预处理器搜索的位置有关,但规范没有定义这些位置 - 当前目录是约定,不是要求)。 【参考方案1】:

它依赖于编译器。也就是说,通常使用" 会将当前工作目录中的标头优先于系统标头。 &lt;&gt; 通常用于系统头文件。从到规范(第 6.10.2 节):

表单的预处理指令

  # include <h-char-sequence> new-line

在一系列实现定义的位置中搜索由&lt;&gt; 分隔符之间的指定序列唯一标识的标头,并用标头的全部内容替换该指令。如何指定位置或标识的标头是实现定义的。

表单的预处理指令

  # include "q-char-sequence" new-line

导致用" 分隔符之间的指定序列标识的源文件的全部内容替换该指令。以实现定义的方式搜索命名的源文件。如果不支持此搜索,或者搜索失败,则重新处理该指令,就像它已读取一样

  # include <h-char-sequence> new-line

与原始的包含相同的序列(包括&gt; 字符,如果有的话) 指示。

所以在大多数编译器上,使用"" 首先检查您的本地目录,如果找不到匹配项,则继续检查系统路径。使用&lt;&gt; 开始搜索系统标头。

【讨论】:

“当前工作目录”是什么意思? AFAIK 引号优先考虑使用此类指令的文件所在的目录。 @Craig,是的,你是对的。我写了一些与我的意思不同的东西——我最近一直在研究的构建系统的一个副作用是两者总是相同的。 +1 用于引用规范。这使您的答案更可验证。 使用 时,Microsoft 实现不以系统标头开头 我不明白an implementation-defined manner = your local directory。是不是 manner != placesplace 是一个静态的地方,所以不是你的动态工作目录?所以有一个manner 用于搜索您的工作目录?【参考方案2】:

当您使用尖括号时,编译器会在包含路径列表中搜索文件。当你使用双引号时,它首先搜索当前目录(即正在编译的模块所在的目录),然后才会搜索包含路径列表。

因此,按照惯例,标准包含使用尖括号,其他所有内容使用双引号。这可确保在(不推荐)您拥有与标准标头同名的本地标头的情况下,将在每种情况下选择正确的标头。

【讨论】:

我不完全同意这个约定。如果您的项目在某些时候被组织成库,您可能希望使库独立。您可能希望将此库移出代码库并依赖操作系统提供的包系统。在这种情况下,您可能必须重构所有包含。您可以通过将包含路径传递给编译器并为本地包含使用尖括号来避免这种情况。所以我想说:在包含库标题时使用尖括号,对其他任何内容使用双引号。

以上是关于在 C++ 中包含头文件时尖括号 < > 和双引号“”之间的区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 PostgreSQL C 扩展中包含头文件

如何在 Qt Creator 的 CMakeLists.txt 中包含头文件?

如何在 Xcode 中包含 <bits/stdc++>

vS 2008 中包含头文件vector的问题:

如何在 GCC 搜索路径中包含头文件?

在作为朋友的类中包含头文件