繁体   English   中英

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

[英]Why the carriage return character is not considered as a white space character by the preprocessor

在 C 标准的第6.4 Lexical elements6.4 Lexical elements中有写

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

正如所见,回车符不包含在空白字符的概念中。

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

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

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

或者这只是标准的缺陷?

相同的问题适用于 C++ 标准。

参见N1570 5.2.1 第 3 段。

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

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

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

源文件输入被翻译成源字符集(标准第 5.1.1.2 节中的翻译阶段 1)。 源字符集在§5.2.1 中描述。

在 C.2011 中,§5.2.1¶3:

在源文件中,应该有某种方式来指示每行文本的结尾; 本国际标准将这样的行尾指示符视为单个换行符。

裸回车不是源字符集的一部分。 如果它作为行终止序列的一部分出现,它会在 C 预处理器开始工作之前被翻译成一个单独的换行符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM