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

4

6.4.3 通用字符名称

通用字符名称不得指定短标识符小于00A0的字符,除了0024($)、0040(@)或0060(`),也不得指定范围在D800到DFFF之间的字符。

除了限制通用性之外,我想不出类似这样的限制有什么好处。大家知道背后的故事吗?


1
考虑禁止范围中应该包含哪些字符。控制字符、已经具有其他含义的字符和代理项。 - Raymond Chen
1个回答

6

D800DFFF 区间内的码点不是有效的,它们是高代理项和低代理项,在UTF-16编码中只能成对出现来表示基本平面之外的码点。

另一个限制是为了避免通用字符名称与可以在C字符集中表示的字符冲突,以使不需要将通用字符名称解析为它们的Unicode等效项的编译器受益。所以编译器没有义务识别+写成\u002B或知道a\u0061表示相同的名称。($@`在C程序中不是注释和字符串以外的有效字符,因此lexer不需要特别处理它们。)

小于A0的码点范围还包括控制字符和空白符。(在C中,\u00A0不被认为是空格符。)


@CoryNelson:谢谢。已修复。 - rici

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接