转义常规字符

时间:2016-11-29 10:38:07

标签: c language-lawyer

"\$"等字符串是否非法?为什么或者为什么不? (Gcc和clang发出警告但是把它视为"$"\如何跟着一个字符,后面带有反斜杠,不会形成应该表现的保留转义序列?

2 个答案:

答案 0 :(得分:2)

来自this escape sequence reference

  

如果反斜杠后跟任何未在此处列出的字符,则ISO C需要诊断。

因此需要编译器打印有关它的消息。

在快速阅读C11规范(INCITS + ISO + IEC + 9899-2011 [2012],遵循上述链接参考文献中的参考文献)后,我没有提及行为。虽然它可以在其他地方指定我怀疑它,所以未指定的转义序列的行为是,未指定。

答案 1 :(得分:2)

对于C11,n1570草案的(非规范性)说明是明确的。 6.4.4.4字符常量段将转义序列定义为:

  

转义序列:

     
      
  • 简单转义序列
  •   
  • 八进制转义序列
  •   
  • 十六进制转义序列
  •   
  • 通用字符名称
  •   
     

simple-escape-sequence:其中一个

     
      
  • \' \" \? \
  •   
  • \ a \ b \ f \ n \ r \ t \ v
  •   
     

八进制转义序列:

     
      
  • \ octal-digit
  •   
  • \ octal-digit octal-digit
  •   
  • \ octal-digit octal-digit octal-digit
  •   
     

十六进制转义序列:

     
      
  • \ x十六进制数字
  •   
  • 十六进制 - 转义 - 序列十六进制数字
  •   

此处未定义\之后的另一个字符的所有其他序列,因此当前标准

未指定行为(未定义)

一张纸条说:

  

77)... 如果任何其他字符后跟反斜杠,   结果不是令牌,需要诊断。请参阅“未来的语言指示”(6.11.4)。

并且6.11.4说:

  

6.11.4字符转义序列

     

作为转义序列的小写字母保留用于将来的标准化。其他   字符可以在扩展名中使用。

通常,编译器发出必需的警告,但忽略多余的\。它完全符合非小写字母,因为它可以是本地扩展名,但它可能会破坏C语言的未来版本中的小写字母,因为它明确地是保留功能