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

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


当前回答

至少对于GCC版本<=3.0,尖括号形式不会在包含文件和包含文件之间生成依赖关系。

因此,如果您想要生成依赖关系规则(例如,使用GCC-M选项),那么必须使用引用的形式表示应该包含在依赖关系树中的文件。

(参见http://gcc.gnu.org/onlinedocs/cpp/Invocation.html )

其他回答

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

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 <file> 

包含默认包含目录所在的文件。

#include "file" 

在编译文件的当前目录中包含文件。双引号还可以指定到其他位置的完整文件路径。

不同的是预处理器搜索要包含的文件的位置。

#include<filename>预处理器以实现定义的方式进行搜索,通常在编译器/IDE预先指定的目录中进行搜索。此方法通常用于包含C标准库的头文件和与目标平台相关联的其他头文件。#include“filename”预处理器也以实现定义的方式进行搜索,但通常用于包括程序员定义的头文件,并且通常包括与包含指令的文件相同的目录(除非给出了绝对路径)。

对于GCC,可以在GCC文档中找到关于搜索路径的更完整描述。

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

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

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

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

#include <filename>

当您想使用C/C++系统或编译器库的头文件时使用。这些库可以是stdio.h、string.h、math.h等。

#include "path-to-file/filename"

当您希望使用自己的自定义头文件(位于项目文件夹或其他位置)时使用。

有关预处理器和标头的详细信息。读取C-预处理器。