在include指令中使用尖括号和引号有什么区别?
#包括<文件名>#包括“文件名”
在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定义的文件夹中检查这些头文件。