协慌网

登录 贡献 社区

#include <filename> 和 #include“filename” 有什么区别?

在 C 和 C ++ 编程语言中,使用尖括号和在include语句中使用引号有什么区别,如下所示?

  1. #include <filename>
  2. #include "filename"

答案

实际上,区别在于预处理器搜索包含文件的位置。

对于#include <filename> ,预处理器以依赖于实现的方式搜索,通常在编译器 / IDE 预先指定的搜索目录中搜索。此方法通常用于包括标准库头文件。

对于#include "filename" ,预处理器首先在与包含该指令的文件相同的目录中进行搜索,然后按照用于#include <filename>表单的搜索路径进行搜索。此方法通常用于包括程序员定义的头文件。

有关搜索路径的 GCC 文档中提供了更完整的描述。

唯一的方法是阅读您的实现文档。

C 标准中 ,第 6.10.2 节第 2 至 4 段规定:

  • 表单的预处理指令

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

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

  • 表单的预处理指令

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

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

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

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

  • 表单的预处理指令

    #include pp-tokens new-line

    (允许与前两种形式中的一种不匹配)。指令中include的预处理标记的处理方式与普通文本一样。 (当前定义为宏名称的每个标识符将替换为其预处理标记的替换列表。)所有替换后生成的指令应与前两个表单中的一个匹配。将<>预处理令牌对或一对"字符"之间的预处理令牌序列组合成单个头名称预处理令牌的方法是实现定义的。

定义:

  • h-char:除了换行符和>之外的源字符集的任何成员

  • q-char:源字符集的任何成员,除了换行符和"

<和> 之间的字符序列唯一地引用标题,该标题不一定是文件。实现几乎可以随意使用字符序列。 (但是,大多数情况下,只需将其视为文件名并在包含路径中进行搜索,就像其他帖子所述。)

如果使用#include "file"表单,则实现首先查找给定名称的文件(如果支持)。如果不是(支持),或者搜索失败,则实现的行为就像使用了另一个( #include <file> )表单一样。

此外,存在第三种形式,当#include指令与上述任何一种形式都不匹配时使用。在这种形式中,一些基本的预处理(例如宏扩展)是在#include指令的 “操作数” 上完成的,结果应该与其他两种形式中的一种匹配。