在include指令中使用尖括号和引号有什么区别?
#包括<文件名>#包括“文件名”
在include指令中使用尖括号和引号有什么区别?
#包括<文件名>#包括“文件名”
当前回答
预处理器的确切行为因编译器而异。以下答案适用于GCC和其他几个编译器。
#include<file.h>告诉编译器在其“include”目录中搜索头文件,例如,对于MinGW,编译器将在C:\MinGW\include\或安装编译器的任何位置搜索file.h。
#include“file”告诉编译器在当前目录(即源文件所在的目录)中搜索文件。
您可以使用GCC的-I标志告诉它,当它遇到带有尖括号的include时,它还应该在-I之后的目录中搜索标头。GCC将把标志后面的目录当作includes目录。
例如,如果您在自己的目录中有一个名为myheader.h的文件,那么如果您使用标志-I调用GCC,可以说#include<myheader.h>。(表示应搜索当前目录中的includes。)
如果没有-I标志,则必须使用#include“myheader.h”来包含文件,或将myheader.h移动到编译器的include目录。
其他回答
编译器生成的实现定义的警告可以(并且将)以不同于程序库的方式对待系统库。
So
#包含<myFilename>
--它实际上声明myFilename位于系统库位置——很可能(而且可能会)隐藏死代码和未使用的变量警告等,当您使用:
#包括“myFilename”
#include <filename>
当您想使用C/C++系统或编译器库的头文件时使用。这些库可以是stdio.h、string.h、math.h等。
#include "path-to-file/filename"
当您希望使用自己的自定义头文件(位于项目文件夹或其他位置)时使用。
有关预处理器和标头的详细信息。读取C-预处理器。
带有尖括号的#include将搜索“依赖于实现的位置列表”(这是一种非常复杂的方式来表示“系统头”)以查找要包含的文件。
带引号的#include将只搜索文件(并且,“以依赖于实现的方式”,bleh)。这意味着,在正常的英语中,它将尝试应用你扔给它的路径/文件名,而不会预先设置系统路径或篡改它。
此外,如果#include“”失败,则标准会将其重新读取为#include<>。
gcc文档有一个(特定于编译器的)描述,虽然它是特定于gcc而非标准的,但它比ISO标准的律师式描述更容易理解。
“<filename>”在标准C库位置搜索而“filename”也会在当前目录中搜索。
理想情况下,您可以使用<…>对于标准C库,“…”表示您编写的当前目录中的库。
了解的唯一方法是阅读实现的文档。
在C标准第6.10.2节第2至4段中规定:
表单的预处理指令#包含<h-char-sequence>新行在实现定义的位置序列中搜索由<和>分隔符之间的指定序列唯一标识的头,并用头的全部内容替换该指令。如何指定位置或标识标题是实现定义的。表单的预处理指令#包括“q-char-sequence”新行导致用“分隔符”之间的指定序列标识的源文件的全部内容替换该指令。将以实现定义的方式搜索命名的源文件。如果不支持此搜索,或者搜索失败,则会像读取指令一样重新处理该指令#包含<h-char-sequence>新行具有与原始文件相同的包含序列(包括>个字符,如果有)指令。表单的预处理指令#包含pp令牌新行(与前两种形式之一不匹配)。指令中include之后的预处理标记与普通文本中的处理相同。(当前定义为宏名称的每个标识符由其预处理令牌的替换列表替换。)所有替换后产生的指令应与前两种形式之一匹配。实现定义了一种方法,通过该方法,<和>预处理令牌对或一对“字符”之间的一系列预处理令牌组合成单个标头名称预处理令牌。定义:h-char:源字符集的任何成员,除了换行符和>q-char:源字符集的任何成员,除了换行符和“