在include指令中使用尖括号和引号有什么区别?
#包括<文件名>#包括“文件名”
在include指令中使用尖括号和引号有什么区别?
#包括<文件名>#包括“文件名”
当前回答
带有尖括号的#include将搜索“依赖于实现的位置列表”(这是一种非常复杂的方式来表示“系统头”)以查找要包含的文件。
带引号的#include将只搜索文件(并且,“以依赖于实现的方式”,bleh)。这意味着,在正常的英语中,它将尝试应用你扔给它的路径/文件名,而不会预先设置系统路径或篡改它。
此外,如果#include“”失败,则标准会将其重新读取为#include<>。
gcc文档有一个(特定于编译器的)描述,虽然它是特定于gcc而非标准的,但它比ISO标准的律师式描述更容易理解。
其他回答
带有尖括号的#include将搜索“依赖于实现的位置列表”(这是一种非常复杂的方式来表示“系统头”)以查找要包含的文件。
带引号的#include将只搜索文件(并且,“以依赖于实现的方式”,bleh)。这意味着,在正常的英语中,它将尝试应用你扔给它的路径/文件名,而不会预先设置系统路径或篡改它。
此外,如果#include“”失败,则标准会将其重新读取为#include<>。
gcc文档有一个(特定于编译器的)描述,虽然它是特定于gcc而非标准的,但它比ISO标准的律师式描述更容易理解。
#include<>用于预定义的头文件
如果头文件是预定义的,那么您只需将头文件名写在尖括号中,它看起来像这样(假设我们有一个预定义的头文件名iostream):
#include <iostream>
#include“”表示程序员定义的头文件
如果你(程序员)编写了自己的头文件,那么你会将头文件名用引号括起来。因此,假设您编写了一个名为myfile.h的头文件,那么这是如何使用include指令包含该文件的示例:
#include "myfile.h"
GCC文件说明了两者之间的区别:
使用预处理指令“#include”包括用户和系统头文件。它有两种变体:#包含<文件>此变体用于系统头文件。它在系统目录的标准列表中搜索名为file的文件。您可以使用-I选项将目录添加到此列表中(请参阅调用)。#包含“文件”此变体用于您自己程序的头文件。它首先在包含当前文件的目录中搜索名为file的文件,然后在引号目录中搜索,然后在与<file>相同的目录中查找。您可以使用-iquote选项将目录添加到报价目录列表中。“#include”的参数(无论是用引号还是尖括号分隔)的行为与字符串常量相似,因为注释无法识别,宏名称也不会展开。因此,#include<x/*y>指定包含名为x/*y的系统头文件。然而,若反斜杠出现在文件中,则它们被视为普通文本字符,而不是转义字符。不处理适用于C中字符串常量的字符转义序列。因此,#include“x\n\\y”指定包含三个反斜杠的文件名。(有些系统将“\”解释为路径名分隔符。所有这些系统也以相同的方式解释“/”。仅使用“/”最为方便。)如果文件名后面的行中有任何内容(注释除外),则为错误。
在引用系统文件时使用#include<filename>。这是一个头文件,可以在系统默认位置(如/usr/include或/usr/local/include)找到。对于需要包含在其他程序中的自己的文件,必须使用#include“filename”语法。
“”将搜索。/第一然后搜索默认包含路径。您可以使用以下命令打印默认包含路径:
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;
}