Ayr*_*osa 10 c c++ gcc language-lawyer
本文档的第2.6节计算包含有以下段落:
如果该行扩展为以 a?<?token 开头并包括 a?>? 令牌,那么 ?<? 和第一个?>? 组合形成要包含的文件名。令牌之间的任何空格都减少到一个空格;然后在初始?<? 之后的任何空格被保留,但在结束之前的尾随空格?>? 被忽略。CPP 根据?angle-bracket includes 的规则搜索文件。
我知道这是实现定义的,但为什么 GCC 必须这样?我特别指的是上面突出显示的句子。
编辑
我刚刚注意到在上面引用的一段之前的第三段说如下:
定义宏时必须小心。
#define保存令牌,而不是文本。预处理器无法知道宏将用作 的参数#include,因此它生成普通标记,而不是标头名称。如果您使用双引号包含,这不太可能导致问题,它与字符串常量足够接近。 但是,如果您使用尖括号,您可能会遇到麻烦。
有谁知道这里指出了什么样的问题?
我猜实现者在实现这个功能时选择了最简单的方式,没有考虑太多。
最初的实施似乎是在 2000 年 7 月 3 日(二十年前!)。相关部分如下所示(来源):
for (;;)
{
t = cpp_get_token (pfile);
if (t->type == CPP_GREATER || t->type == CPP_EOF)
break;
CPP_RESERVE (pfile, TOKEN_LEN (t));
if (t->flags & PREV_WHITE)
CPP_PUTC_Q (pfile, ' ');
pfile->limit = spell_token (pfile, t, pfile->limit);
}
Run Code Online (Sandbox Code Playgroud)
CPP_GREATER值得注意的是,当它看到令牌(即>)时,在为令牌保留内存之前,它会中断。这是有道理的,因为当令牌不被写入缓冲区时不需要分配内存。
然后,仅在保留内存后t->flags & PREV_WHITE,预处理器才会检查令牌前面是否有空格 ( ),如果有,则将空格字符写入缓冲区。
因此,在 中,仅保留< foo / bar >前面foo(即初始的 后面<)、/和之前的空格。bar
| 归档时间: |
|
| 查看次数: |
272 次 |
| 最近记录: |