C语言 – #include 和#include“filename”有什么区别?

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

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

答案

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

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

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

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


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

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

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


这里的一些好的答案引用了C标准,但忘记了POSIX标准,特别是c99(例如C编译器)命令的特定行为。

根据The Open Group Base Specifications Issue 7

-I 目录

在查看常用位置之前,更改用于搜索名称不是绝对路径名的标头的算法,以查找目录路径名所指定的目录。因此,名称以双引号(“”)括起来的标题应首先在#include行的文件目录中搜索,然后在-I选项中命名的目录中搜索,最后在通常的位置搜索。对于名称用尖括号(“<>”)括起来的标题,只能在-I选项中指定的目录中搜索标题,然后在通常的位置搜索标题。在-I选项中命名的目录应按指定的顺序进行搜索。c99命令调用。

因此,在符合POSIX的环境中,使用符合POSIX标准的C编译器,#include "file.h"可能会首先搜索./file.h,其中.是带有#include语句的文件所在的目录,同时#include <file.h>,可能/usr/include/file.h首先搜索,/usr/include系统定义在哪里通常的标题位置(似乎没有POSIX定义)。

添加评论

友情链接:蝴蝶教程