考虑以下代码片段。
在
另一方面,lex.phases指出:
看起来 msvc 和 gcc 对这个代码片段 differently 的处理方式不同。
#define X iostream>
#include <X
在
#include
之后,最长的字符序列,可以构成预处理标记是<
,并且后面跟着一个标识符。在预处理期间,该标识符将被替换为iostream>
,并且在所有替换完成后,该指令与形式< h-char-sequence >
匹配。因此,程序应该是良好形式的。另一方面,lex.phases指出:
据我所知,上述程序并不以部分预处理令牌结束。然而,脚注中提到:源文件不得以部分预处理标记或部分注释结尾。
这让我感到困惑。源文件可以以缺少闭合的部分预处理令牌可能来自于以需要终止字符序列的多字符令牌的第一部分结束的源文件,比如缺少闭合的
"
或>
的头文件名。
>
的头文件名结束吗?看起来 msvc 和 gcc 对这个代码片段 differently 的处理方式不同。
>
,所以根据你自己的引用,它是无效的。为什么会有人犯下这样的罪行,这是另一个谜。 - undefined#include
指令中使用宏(包括像这样的宏),但是你引用的部分却说整个文件都是无效的(甚至在宏展开之前)。因此,如果在该包含之后有任何内容(比如空注释),那么它将是有效的,但现在的情况是无效的。 - undefined