为什么回车字符不被预处理视为白色空间characetr

时间:2017-03-31 19:02:23

标签: c whitespace language-lawyer preprocessor

在C标准的6.4 Lexical elements部分中写了

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

如图所示,回车字符不包含在空格字符的概念中。

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

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

故意在描述预处理的部分中没有提到回车字符,如果是,那么原因是什么?

或者它只是标准的缺陷?

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

2 个答案:

答案 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预处理器开始工作之前转换为单个换行符。