本文档在其2.6计算的包括部分中具有以下段落:
如果该行扩展到以<令牌开头并包括>令牌的令牌流,则<和第一个>之间的令牌将合并以形成要包含的文件名。令牌之间的任何空格都减少为一个空格;那么将保留初始<之后的任何空格,但忽略闭合>之前的结尾空格。CPP根据尖括号包含的规则搜索文件。
我知道这是实现定义的,但是为什么GCC必须采用这种方式?我指的是上面突出显示的句子。
编辑
我刚刚注意到,上面引用的第三段之前的内容如下:
定义宏时必须小心。
#define
保存令牌,而不是文本。预处理器无法知道该宏将用作的参数#include
,因此它会生成普通标记,而不是标头名称。如果您使用的双引号包含与字符串常量足够接近,则这不太可能引起问题。 但是,如果使用尖括号,则可能会遇到麻烦。
有谁知道这里指出了什么麻烦?
6
最好的猜测是,GCC的开发人员认为,文件名末尾有空格是可憎的。
—
user3386109
带有前导和/或尾随空格的文件名非常挑剔,尤其是在Windows上。
—
雷米·勒博
仅仅因为已经定义了它,并不一定意味着必须这样定义。该标准未强制要求。
—
eerorika
Visual Studio会删除初始空间和结束空间,因此行为会有所不同。HP aCC的行为类似于gcc(可能出于兼容性原因)。
—
Slimak
有时,文档只是描述了代码发生的事情,而不是相反的情况,特别是在无关紧要的情况下(如果使用双引号,则可以在任何地方使用任何空间)。
—
rustyx