#include <>和#include""

ful*_*ton 12 c++ compiler-construction include

可能重复:
#include <filename>和#include"filename"之间的区别是什么

除了编译器搜索路径的方式之外,两个#include语法之间是否存在根本区别?

我觉得英特尔的编译器没有提供完全相同的输出.

unw*_*ind 23

根本区别在于搜索哪些路径.

您应该使用"系统"包含的尖括号形式,以及项目本地包含的常规引号.

  • 在实践中,这可能是真的,但根据C语言标准,真正的区别在于编译器是否应该搜索*header*或**file*.(提示:标题不一定是文件,尽管它们几乎总是如此). (5认同)
  • @Rich:例如,它们可能是编译器/预处理器内置函数.预处理器可以在包含标准头文件时插入硬编码的代码,而不是在文件系统上搜索文件.或者它可以在数据库中查询标题的内容,从互联网上下载标题......你明白了.但是如果不是要求<stddef.h>,而是要求"stddef.h",那么编译器*应该首先搜索一个名为stddef.h的文件,即使它内置了一个stddef.h (或通过其他方式获得). (2认同)

Dan*_*ing 22

C语言标准表示<>将用于"标题",并""用于"源文件".现在,不要全神贯注于"源文件"的事情.当标准说"源文件"时,它并不意味着你的想法.标准中使用的术语"源文件"包含我们通俗地称之为"头文件"的内容(除了我们通常称之为"源文件"的内容).

当标准谈到"标题"时,它根本不是专门讨论文件.该标准不要求标题作为文件存在.它们可以内置于编译器中以用于所有标准维护.

所以,真正的区别<>""<>用于""用于文件.如果你知道你将要包含的来源是一个文件,那么你应该使用"".

在实践中,编译器使用不同的搜索算法<>"".标准允许这样做,因为用于任何一个的搜索算法是实现定义的.但这不是标准所表达的真正差异.


Dev*_*lar 7

Dan Molding做对了; 放松,黑客和尼克巴斯汀弄错了.抱歉.

#include <...>
Run Code Online (Sandbox Code Playgroud)

标题,甚至不需要是文件系统中的文件,但可以是例如编译器内部的.

#include "..."
Run Code Online (Sandbox Code Playgroud)

是用于文件,并且只有在找不到这样的文件时,它才会默认返回#include <...>.

查找这些头文件和文件的方式和位置,以及<>是否应该用于系统文件和""用于项目文件,这确实是一种常见的约定,完全取决于编译器和项目.

C标准(ISO/IEC 9899:1999)说(强调我的):

6.10.2源文件包含

约束

#include指示字应识别能够由实现待处理的报头或源文件.

语义

表单的预处理指令

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

搜索一系列实现定义的位置,查找 <和>分隔符之间的指定序列唯一标识的标头,并使标头的整个内容替换该指令.如何指定场所或标识的头是实现定义的.

表单的预处理指令

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

导致由"delimiters"之间的指定序列标识的源文件的全部内容替换该指令 .以实现定义的方式搜索指定的源文件.如果不支持此搜索,或者搜索失败后,指令被重新处理,就像它读取一样

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

使用原始指令中相同的包含序列(包括>字符,如果有的话).


Mic*_*ker 6

引用指示首先在当前目录中搜索,然后在系统目录中搜索(在编译器/预处理器中硬编码的路径或指定的路径-I).通过使用尖括号,您可以选择不先搜索当前目录.

编译器输出肯定不依赖于引号,因为它是在预处理阶段处理的.除了由于更改的搜索行为导致的情况,包括不同的文件.