为什么C99对通用字符名称有如此奇怪的限制?

an0*_*an0 3 c unicode

6.4.3通用字符名称

通用字符名称不应指定短标识符小于00A0而不是0024($),0040(@)或0060(`)的字符,也不能指定D800到DFFF范围内的字符.

除了这种限制不再具有"普遍性"这一事实外,我无法想出这种限制的充分理由.谁知道背景故事?

ric*_*ici 6

D800通过DFFF包容性不是有效的代码点; 它们是高和低代理,只能以UTF-16编码成对出现,以便表示基准平面之外的代码点.

另一个限制避免了通用字符名称与可以在C字符集中表示的字符冲突,这对于编译器的好处是不利的,因为编译器不会将通用字符名称解析为它们的unicode等价物.因此编译器没有义务识别+写入\u002B或知道a\u0061代表相同的名称.($,@并且`在注释和字符串之外的C程序中无效,因此它们不需要词法分析器的任何特别注意.)

代码点的范围小于A0还包括控制字符和空格.(C不认为\u00A0是空格.)