4 回答
TA贡献1860条经验 获得超8个赞
唯一的方法是阅读您的实现文档。
在C标准中,第6.10.2节第2至4段规定:
表单的预处理指令
#include <h-char-sequence> new-line搜索的用于实现定义的地方的序列报头由之间的指定序列唯一地识别
<
和>
分隔符,并且使得由所述的全部内容替换该指令的标头。如何指定场所或标识的头是实现定义的。表单的预处理指令
#include "q-char-sequence" new-line导致由分隔符之间的指定序列标识的源文件的全部内容替换该指令
"
。以实现定义的方式搜索指定的源文件。如果不支持此搜索,或者搜索失败,则会重新处理该指令,就像它读取一样#include <h-char-sequence> new-line使用
>
原始指令中相同的包含序列(包括字符,如果有的话)。表单的预处理指令
#include pp-tokens new-line(允许与前两种形式中的一种不匹配)。
include
指令中的预处理标记处理与正常文本一样。(当前定义为宏名称的每个标识符将替换为其预处理标记的替换列表。)所有替换后生成的指令应与前两个表单中的一个匹配。将a<
和>
预处理令牌对或一对"
字符之间的一系列预处理标记组合成单个标题名称预处理标记的方法是实现定义的。定义:
h-char:源字符集的任何成员,除了换行符和
>
q-char:源字符集的任何成员,除了换行符和
"
TA贡献1836条经验 获得超4个赞
<和>之间的字符序列唯一地引用标题,该标题不一定是文件。实现几乎可以随意使用字符序列。(但是,大多数情况下,只需将其视为文件名并在包含路径中进行搜索,就像其他帖子所述。)
如果使用该#include "file"
表单,则实现首先查找给定名称的文件(如果支持)。如果不是(支持),或者搜索失败,则实现的行为就像使用了other(#include <file>
)形式一样。
此外,存在第三种形式,当#include
指令与上述任何一种形式都不匹配时使用。在这种形式中,一些基本的预处理(例如宏扩展)在#include
指令的“操作数”上完成,并且结果预期与其他两种形式中的一种匹配。
TA贡献1770条经验 获得超3个赞
这里的一些好的答案引用了C标准,但忘记了POSIX标准,特别是c99(例如C编译器)命令的特定行为。
根据The Open Group Base Specifications Issue 7,
-I 目录
在查找常用位置之前,更改搜索名称不是绝对路径名的标头的算法,以查找目录路径名所指定的目录。因此,名称以双引号(“”)括起来的标题应首先在#include行的文件目录中搜索,然后在-I选项中命名的目录中搜索,最后在通常的位置搜索。对于名称用尖括号(“<>”)括起来的标题,只能在-I选项中指定的目录中搜索标题,然后在通常的位置搜索标题。在-I选项中命名的目录应按指定的顺序进行搜索。c99命令调用。
因此,在符合POSIX标准的环境中,使用符合POSIX标准的C编译器,#include "file.h"
可能会首先搜索./file.h
,其中.
是带有#include
语句的文件所在的目录,同时#include <file.h>
,可能/usr/include/file.h
首先搜索,/usr/include
系统定义在哪里通常的标题位置(似乎没有POSIX定义)。
- 4 回答
- 0 关注
- 1056 浏览
添加回答
举报