在include指令中使用尖括号和引号有什么区别?

#包括<文件名>#包括“文件名”


当前回答

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

根据开放组基础规范第7版,

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

因此,在符合POSIX的环境中,使用符合POSIX标准的C编译器,#include“file.h”可能会被搜索/首先是文件.h,其中。是包含#include语句的文件所在的目录,而#include<file.h>可能会首先搜索/usr/include/file.h,其中/usr/include是系统定义的头的常用位置(POSIX似乎没有定义)。

其他回答

<和>之间的字符序列唯一地引用标头,而标头不一定是文件。实现可以随意使用字符序列。(不过,大多数情况下,只需将其作为文件名,并在include路径中进行搜索,正如其他帖子所述。)

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

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

“”将搜索。/第一然后搜索默认包含路径。您可以使用以下命令打印默认包含路径:

gcc -v -o a a.c

以下是一些例子,让事情更清楚:代码交流工作

// a.c
#include "stdio.h"
int main() {
        int a = 3;
        printf("a = %d\n", a);
        return 0;

}

b.c的代码也有效

// b.c
#include <stdio.h>
int main() {
        int a = 3;
        printf("a = %d\n", a);
        return 0;

}

但当我在当前目录中创建名为stdio.h的新文件时

// stdio.h
inline int foo()
{
        return 10;
}

a.c将生成编译错误,但b.c仍然有效

和“”,<>可以与相同的文件名一起使用。因为搜索路径优先级不同。所以直流电也起作用

// d.c
#include <stdio.h>
#include "stdio.h"
int main()
{
        int a = 0;

        a = foo();

        printf("a=%d\n", a);

        return 0;
}

在引用系统文件时使用#include<filename>。这是一个头文件,可以在系统默认位置(如/usr/include或/usr/local/include)找到。对于需要包含在其他程序中的自己的文件,必须使用#include“filename”语法。

它确实:

"mypath/myfile" is short for ./mypath/myfile

具有是#include所在文件的目录和/或编译器的当前工作目录,和/或default_include_path

and

<mypath/myfile> is short for <defaultincludepaths>/mypath/myfile

如果./在<default_include_paths>中,则不会有任何区别。

如果mypath/myfile位于另一个include目录中,则行为未定义。

#include <abc.h>

用于包含标准库文件。因此编译器将检查标准库头所在的位置。

#include "xyz.h"

将告诉编译器包含用户定义的头文件。因此编译器将在当前文件夹或-I定义的文件夹中检查这些头文件。