C99是否允许标识符中的通用字符名称?

时间:2014-11-21 22:51:17

标签: c language-lawyer c99

根据C99规范WG14 / N1124草案§6.4.2,“标识符”:

identifier:  
       identifier-nondigit  
       identifier identifier-nondigit  
       identifier digit

identifier-nondigit:  
       nondigit  
       universal-character-name  
       other implementation-defined characters

§6.4.3,“通用角色名称”:

universal-character-name:
       \u hex-quad
       \U hex-quad hex-quad

这似乎表明像foo\u00AAbar这样的标识符根据语法是有效的。我在语义上找不到任何暗示的东西。然而,GCC拒绝这样的标识符,甚至没有试图解析它:

<stdin>:2: error: stray ‘\’ in program
<stdin>:2: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘u00AAbar’
<stdin>:2: error: ‘u00AAbar’ undeclared (first use in this function)

这是对GCC,C99标准或我的推理的疏忽吗?

1 个答案:

答案 0 :(得分:7)

这三者中没有一个。它只是一个长期未实现的(或者更确切地说,仅部分实现的)功能。它最近已经完成,并将在GCC 5中提供。在该版本之前,您可以使用-fextended-identifiers命令行选项,但在某些情况下它出错导致它没有默认情况下启用。

您可以在Status of C99 features in GCC上找到此列表。