[英]Why the carriage return character is not considered as a white space character by the preprocessor
在 C 标准的第6.4 Lexical elements
节6.4 Lexical elements
中有写
- ...预处理令牌可以用空格分隔; 这由注释(稍后描述)或空白字符(空格、水平制表符、换行符、垂直制表符和换页符)或两者组成。
正如所见,回车符不包含在空白字符的概念中。
另一方面,在标准 C 函数isspace
的描述中有写( 7.4.1.10 The isspace function
)
- ...标准的空白字符如下:空格 ('')、换页符 ('\\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.