允许哪些令牌作为 #include 的参数?

What tokens are permitted as arguments to #include?

本文关键字:参数 #include 许哪些 令牌      更新时间:2023-10-16

包含中的标准需要允许什么样的令牌? 例如,文件名中是否允许使用空格?

从 cpp 对源文件包含的首选项

任何预处理标记(宏常量或表达式(都是 允许作为 #include 和__has_include(自 C++17 年起(的参数 只要它们扩展到由<>或 " 包围的字符序列。

然后在解释中

实现定义的方式搜索文件。意图 此语法用于搜索不受 实现。

此外,c++20 最终工作草案5.8 标头名称 [lex.header]和 ISO/IEC 9899:19996.4.7 标头名称(换行符、>
"除外(。

header-name:
< h-char-sequence >
" q-char-sequence "
h-char-sequence :
h-char
h-char-sequence h-char
h-char:
any member of the source character set except new-line and >
q-char-sequence :
q-char
q-char-sequence q-char
q-char:
any member of the source character set except new-line and "

(这个答案是针对C的,有正确的引用和引用。它不包括C++。

C 2018 6.10.2 第2至4段说:

2 表单的预处理指令

#<h 字符序列换行

符在实现定义的位置序列中搜索由<分隔符之间的指定序列唯一标识的标头,并导致该指令被标头的全部内容替换。如何指定位置或标识标头由实现定义。

3 表单的预处理指令

# 包含 ">q-char-sequence">换行符

导致将该指令替换为由">分隔符之间的指定序列标识的源文件的全部内容。以实现定义的方式搜索命名源文件。如果不支持此搜索,或者搜索失败,则重新处理指令,就像读取

#<符包含h 字符序列

具有与原始指令相同的包含序列(包括>个字符,如果有(。

4 表单的预处理指令

# 包含pp 代币换行符

(与前两种形式之一不匹配(是允许的。包含在指令中的预处理标记将像在普通文本中一样进行处理。(当前定义为宏名称的每个标识符都将替换为其预处理令牌的替换列表。所有替换后产生的指令应与前两种形式之一匹配。<预处理令牌对或一对 ">字符之间的预处理令牌序列组合成单个标头名称预处理令牌的方法由实现定义。

语法符号h-char-sequenceq-char-sequence在 6.4.7 中定义。h 字符序列<后跟除换行符或>以外的源字符集的任何成员(至少一个(,然后以结尾。q-char-sequence* 与<相同,替换为">.但是,如果字符'\//或/*出现在任一序列中,或者">出现在h 字符序列中,则行为是未定义的。