C++ GCC&x27;s的尖括号实现包括。为什么必须如下所述?

C++ GCC&x27;s的尖括号实现包括。为什么必须如下所述?,c++,c,gcc,language-lawyer,C++,C,Gcc,Language Lawyer,在其第2.6节中,包括以下段落: 如果行扩展为以   令牌,然后是  合并以形成要包含的文件名。任何 令牌之间的空格减少为单个空格然后是任意空间 在最初的  被忽略。CPP根据规则搜索文件 对于 角支架包括 我知道这是实现定义的,但为什么GCC必须这样?我指的是上面突出显示的句子 编辑 我刚才注意到,上面引用的那一段之前的第三段说: 定义宏时必须小心#定义保存令牌, 不是文本。预处理器无法知道宏将 用作#include的参数,因此生成普通 标记,而不是标头名称。如果您 使用双引号include,

在其第2.6节中,包括以下段落:

如果行扩展为以   令牌,然后是  合并以形成要包含的文件名。任何 令牌之间的空格减少为单个空格然后是任意空间 在最初的  被忽略。CPP根据规则搜索文件 对于 角支架包括

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

编辑

我刚才注意到,上面引用的那一段之前的第三段说:

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


有人知道这里指出的是什么样的问题吗?

我想实现者在实现此功能时选择了最简单的方法,没有考虑太多

似乎最初的实施是在2000-07-03年(二十年前!)。相关部分如()所示:

(;;)的

{
t=cpp\u get\u令牌(pfile);
如果(t->type==CPP|u更大| t->type==CPP|u EOF)
打破
CPP_储备(pfile、TOKEN_LEN(t));
如果(t->标志和上一个白色)
CPP_PUTC_Q(pfile,”);
pfile->limit=法术标记(pfile,t,pfile->limit);
}
值得注意的是,在为令牌保留内存之前,当它看到
CPP\u更大的
令牌(即
)时,它会爆发。这是有意义的,因为当令牌不会写入缓冲区时,不需要分配内存

然后,只有在保留内存后,预处理器才会检查令牌是否有前面的空格(
t->flags&PREV\u WHITE
),如果有,则将空格字符写入缓冲区


因此,在
中,只有
foo
(也就是说,在最初的
之后,最好的猜测是GCC的开发人员认为在文件名的末尾有空格是一件令人憎恶的事情。带有前导和/或尾随空格的文件名很难使用,特别是在Windows上。仅仅因为它是这样定义的,并不一定意味着它必须这样定义。I标准中没有强制要求使用t。Visual Studio同时删除起始和结束空间,因此其行为不同。HP aCC的行为类似于gcc(可能是出于兼容性原因)。有时文档只是描述代码的行为,而不是相反的方式,尤其是在无关紧要的情况下(如果使用双引号,您可以在任何地方使用任何空格)。但是,条件
if(t->flags&PREV_WHITE)CPP_PUTC_Q(pfile),;
是否与文档中的说法相矛盾:“令牌之间的任何空格都减少为单个空格;…”?