为什么预处理器不将回车符视为空白字符

Vla*_*cow 5 c whitespace preprocessor language-lawyer

在 C 标准的章节中6.4 Lexical elements写着

  1. ...预处理标记可以用空格分隔;它由注释(稍后描述)或空白字符(空格、水平制表符、换行符、垂直制表符和换页符)或两者组成。

可以看出,回车符不包括在空白字符的概念中。

另一方面,在标准 C 函数的描述中isspace写有 ( 7.4.1.10 The isspace function)

  1. ...标准空白字符如下:空格 ('')、换页符 ('\f')、换行符 ('\n')、回车符 ('\r')、水平制表符 ( '\t')和垂直制表符('\v')。在“C”语言环境中,isspace 仅对标准空白字符返回 true。

在描述预处理的部分中是否故意未提及回车符?如果是,原因是什么?

或者这只是标准的缺陷?

同样的问题对于 C++ 标准也有效。

Kei*_*son 5

参见N1570 5.2.1 第 3 段。

回车符是基本执行字符集的成员(并且将其视为isspace()空白字符),但它不是基本源字符集的一部分。

源和执行基本字符集都包括“空格字符和表示水平制表符、垂直制表符和换页符的控制字符”。另外,“在基本执行字符集中,应有代表警报、退格、回车和换行的控制字符”。

在某些系统上,回车符是行结束指示的一部分;任何此类指示都被视为单个换行符。不属于源文件中行尾指示符一部分的回车符会导致未定义的行为。