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

Fra*_*til 3 c c99 language-lawyer

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

identifier:  
       identifier-nondigit  
       identifier identifier-nondigit  
       identifier digit

identifier-nondigit:  
       nondigit  
       universal-character-name  
       other implementation-defined characters
Run Code Online (Sandbox Code Playgroud)

§6.4.3,"通用字符名称":

universal-character-name:
       \u hex-quad
       \U hex-quad hex-quad
Run Code Online (Sandbox Code Playgroud)

这似乎表明类似的标识符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)
Run Code Online (Sandbox Code Playgroud)

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

小智 7

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

您可以在GCC中的C99功能状态中看到此列表.