GCC 对尖括号的实现包括。为什么必须如下所述?

Ayr*_*osa 10 c c++ gcc language-lawyer

本文档的第2.6计算包含有以下段落:

如果该行扩展为以 a?<?token 开头并包括 a?>? 令牌,那么 ?<? 和第一个?>? 组合形成要包含的文件名。令牌之间的任何空格都减少到一个空格;然后在初始?<? 之后的任何空格被保留,但在结束之前的尾随空格?>? 被忽略。CPP 根据?angle-bracket includes 的规则搜索文件。

我知道这是实现定义的,但为什么 GCC 必须这样?我特别指的是上面突出显示的句子。

编辑

我刚刚注意到在上面引用的一段之前的第三段说如下:

定义宏时必须小心。#define保存令牌,而不是文本。预处理器无法知道宏将用作 的参数#include,因此它生成普通标记,而不是标头名称。如果您使用双引号包含,这不太可能导致问题,它与字符串常量足够接近。 但是,如果您使用尖括号,您可能会遇到麻烦

有谁知道这里指出了什么样的问题?

cpp*_*ner 9

我猜实现者在实现这个功能时选择了最简单的方式,没有考虑太多。

最初的实施似乎是在 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