在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路径中进行搜索,正如其他帖子所述。)

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

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

<file>include告诉预处理器首先在-I目录和预定义目录中搜索,然后在.c文件的目录中搜索。“file”include告诉预处理器首先搜索源文件的目录,然后返回到-I并预定义。无论如何都会搜索所有目的地,只是搜索顺序不同。

2011年标准主要讨论了“16.2源文件包含”中的包含文件。

2表单的预处理指令#包含<h-char-sequence>新行在实现定义的位置序列中搜索由在<和>分隔符之间指定的序列,并导致用标题的全部内容替换该指令。如何指定位置或标识标题定义了实现。3表单的预处理指令#包括“q-char-sequence”新行导致将该指令替换为在“分隔符”之间指定的序列。命名的源文件是以实现定义的方式搜索。如果此搜索是不受支持,或者如果搜索失败,指令将被重新处理为如果它读#包含<h-char-sequence>新行与原始指令相同的包含序列(包括>个字符,如果有)。

请注意,如果找不到文件,“xxx”格式将降级为<xxx>格式。其余部分由实现定义。

“<filename>”在标准C库位置搜索而“filename”也会在当前目录中搜索。

理想情况下,您可以使用<…>对于标准C库,“…”表示您编写的当前目录中的库。

这里的许多答案都集中在编译器搜索文件的路径上。虽然这是大多数编译器所做的,但一个符合标准的编译器可以使用标准头的效果进行预编程,并将#include<list>视为一个开关,它根本不需要作为一个文件存在。

这不是纯粹的假设。至少有一个编译器可以这样工作。建议仅对标准标头使用#include<xxx>。

编译器生成的实现定义的警告可以(并且将)以不同于程序库的方式对待系统库。

So

#包含<myFilename>

--它实际上声明myFilename位于系统库位置——很可能(而且可能会)隐藏死代码和未使用的变量警告等,当您使用:

#包括“myFilename”