在C标准的6.4 Lexical elements
部分中写了
- ...预处理令牌可以用空格分隔;这包括 注释(稍后描述)或空白字符 (空格,水平制表符,换行符,垂直制表符和换页符),或 两者。
醇>
如图所示,回车字符不包含在空格字符的概念中。
另一方面,标准C函数isspace
的描述中写有(7.4.1.10 The isspace function
)
- ...标准的空格字符如下:空格(''),换页符(' \ f'),换行符(' \ n'),回车(' \ r'), 水平标签(' \ t')和垂直标签(' \ v')。在" C"语言环境, isspace仅对标准空格字符返回true。
醇>
故意在描述预处理的部分中没有提到回车字符,如果是,那么原因是什么?
或者它只是标准的缺陷?
同样的问题对C ++标准有效。
答案 0 :(得分:4)
见N1570 5.2.1第3段。
回车符是基本执行字符集的成员(并由isspace()
视为空格字符),但它不是基本源字符集的一部分。
源和执行基本字符集都包括“空格字符,以及表示水平制表符,垂直制表符和换页符的控制字符”。另外,“在基本执行字符集中,应有代表警报,退格,回车和新行的控制字符”。
在某些系统上,回车字符是行尾的指示的一部分;任何此类指示均视为单一新线。回车字符不源文件中行尾行为指示符的一部分会导致未定义的行为。
答案 1 :(得分:3)
源文件输入被转换为源字符集(标准的第5.1.1.2节中的转换阶段1)。源字符集在§5.2.1中描述。
在C.2011,§5.2.1¶3:
在源文件中,应该有一些表示结束的方法 每行文字;这个国际标准将这样的行尾指标看作是一个单行字符。
裸回车不是源字符集的一部分。如果它作为行终止序列的一部分出现,它会在C预处理器开始工作之前转换为单个换行符。