在include指令中使用尖括号和引号有什么区别?
#包括<文件名>#包括“文件名”
在include指令中使用尖括号和引号有什么区别?
#包括<文件名>#包括“文件名”
当前回答
#include <filename>
当您想使用C/C++系统或编译器库的头文件时使用。这些库可以是stdio.h、string.h、math.h等。
#include "path-to-file/filename"
当您希望使用自己的自定义头文件(位于项目文件夹或其他位置)时使用。
有关预处理器和标头的详细信息。读取C-预处理器。
其他回答
不同的是预处理器搜索要包含的文件的位置。
#include<filename>预处理器以实现定义的方式进行搜索,通常在编译器/IDE预先指定的目录中进行搜索。此方法通常用于包含C标准库的头文件和与目标平台相关联的其他头文件。#include“filename”预处理器也以实现定义的方式进行搜索,但通常用于包括程序员定义的头文件,并且通常包括与包含指令的文件相同的目录(除非给出了绝对路径)。
对于GCC,可以在GCC文档中找到关于搜索路径的更完整描述。
了解的唯一方法是阅读实现的文档。
在C标准第6.10.2节第2至4段中规定:
表单的预处理指令#包含<h-char-sequence>新行在实现定义的位置序列中搜索由<和>分隔符之间的指定序列唯一标识的头,并用头的全部内容替换该指令。如何指定位置或标识标题是实现定义的。表单的预处理指令#包括“q-char-sequence”新行导致用“分隔符”之间的指定序列标识的源文件的全部内容替换该指令。将以实现定义的方式搜索命名的源文件。如果不支持此搜索,或者搜索失败,则会像读取指令一样重新处理该指令#包含<h-char-sequence>新行具有与原始文件相同的包含序列(包括>个字符,如果有)指令。表单的预处理指令#包含pp令牌新行(与前两种形式之一不匹配)。指令中include之后的预处理标记与普通文本中的处理相同。(当前定义为宏名称的每个标识符由其预处理令牌的替换列表替换。)所有替换后产生的指令应与前两种形式之一匹配。实现定义了一种方法,通过该方法,<和>预处理令牌对或一对“字符”之间的一系列预处理令牌组合成单个标头名称预处理令牌。定义:h-char:源字符集的任何成员,除了换行符和>q-char:源字符集的任何成员,除了换行符和“
编译器生成的实现定义的警告可以(并且将)以不同于程序库的方式对待系统库。
So
#包含<myFilename>
--它实际上声明myFilename位于系统库位置——很可能(而且可能会)隐藏死代码和未使用的变量警告等,当您使用:
#包括“myFilename”
#包括<文件名>
预处理器以依赖于实现的方式进行搜索。它告诉编译器搜索系统头文件所在的目录。此方法通常用于查找标准头文件。
#包括“文件名”
这告诉编译器在程序运行的地方搜索头文件。如果失败,它的行为类似于#include<filename>,并在存储系统头文件的位置搜索该头文件。此方法通常用于标识用户定义的头文件(由用户创建的头文件)。如果您想调用标准库,请不要使用它,因为它比#include<filename>需要更多的编译时间。
<file>include告诉预处理器首先在-I目录和预定义目录中搜索,然后在.c文件的目录中搜索。“file”include告诉预处理器首先搜索源文件的目录,然后返回到-I并预定义。无论如何都会搜索所有目的地,只是搜索顺序不同。
2011年标准主要讨论了“16.2源文件包含”中的包含文件。
2表单的预处理指令#包含<h-char-sequence>新行在实现定义的位置序列中搜索由在<和>分隔符之间指定的序列,并导致用标题的全部内容替换该指令。如何指定位置或标识标题定义了实现。3表单的预处理指令#包括“q-char-sequence”新行导致将该指令替换为在“分隔符”之间指定的序列。命名的源文件是以实现定义的方式搜索。如果此搜索是不受支持,或者如果搜索失败,指令将被重新处理为如果它读#包含<h-char-sequence>新行与原始指令相同的包含序列(包括>个字符,如果有)。
请注意,如果找不到文件,“xxx”格式将降级为<xxx>格式。其余部分由实现定义。