允许哪些令牌作为 #include 的参数?
What tokens are permitted as arguments to #include?
包含中的标准需要允许什么样的令牌? 例如,文件名中是否允许使用空格?
从 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-sequence和q-char-sequence在 6.4.7 中定义。h 字符序列<后跟除换行符或>以外的源字符集的任何成员(至少一个(,然后以结尾。q-char-sequence* 与<相同,替换为">.但是,如果字符'、\、//或/*出现在任一序列中,或者">出现在h 字符序列中,则行为是未定义的。
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 既然存在危险,为什么项目要使用-I include开关
- 如何使用Luacneneneba API正确读取字符串和表参数
- 允许哪些令牌作为 #include 的参数?
- 如何 #include 作为函数参数的字符串?c ++
- Cmake 和 QT5 - Include 只需要一个参数
- 将include/library目录和链接器参数传播到解决方案中的所有项目
- 在源文件中指定include前缀与在编译器的搜索路径参数中指定include前缀的优缺点是什么