C++标识符中的Unicode字符
本文共641字。
版权声明:署名-非商业性使用-相同方式共享
|
CC BY-NC-SA 2.5 CN
这其实是我的课程作业,但是因为确实解决了我的一大疑惑和内容比较充实,所以发到这里。
在C++ References的Language栏目下的Identifiers栏目中,有关于C++中标识符命名规则的说明[1]:
- 首字符应为:
- 大小写字母
- 下划线
- 带有
XID_Start
属性的任意Unicode字符
- 其他字符应为:
- 数字
- 大小写字母
- 下划线
- 带有
XID_Continue
属性的任意Unicode字符
原网页在两个规则的最后一条末尾给出了一个链接,指向2023年9月1日发布的Unicode 15.1.0标准的第31号附件:UNICODE IDENTIFIERS AND SYNTAX。这个附件的表2[2]指出了上述规则中提到的XID_
属性的说明和覆盖范围:
这里XID_
中的X
表示Extended
(笔者个人意见),实际意义就是其从ID_
中经过NFKC
(Normalization Form Compatibility Composition)派生。在表格中,同样给出了ID_
属性的说明和覆盖范围:
-
ID_Start
- 大小写字母
- titlecase letters(似乎与希腊语有关,这里因为和“大写字母”翻译重合不再翻译)
- modifier letters(同上,但似乎不是希腊语)
- other letters(同上)
- letter numbers(同上,类似于各种语言的罗马数字)
- 除
Pattern_Syntax
和Pattern_White_Space
[4]的Other_ID_Start
-
ID_Continue
- 符合
ID_Start
属性的字符 - 非间距标记
- 间距组合标记
- 数字
- 连接符标点
- 除
Pattern_Syntax
和Pattern_White_Space
[4:1]的Other_ID_Continue
- 符合
其中仍然存在的一些不明属性因过于无聊和没有必要不再展开。
其中,平常提到的希腊字母在小写字母的范畴内,大部分中文汉字和其他国家的文字在other letter范畴内。因此实际上你可以用中文、希腊字母做标识符名字的一部分。
但是,在实际测试中,gcc 10.2.1能够正确识别由Emoji表情符号组成的标识符,而Emoji表情所属的other symbol并不在上述属性的范围内。说明编译器开发者对待标准的态度也不是那么一板一眼。
需要注意的是,以上所说的内容只适用于C++11及之后的标准。实际上,C++的Unicode字符支持首次出现是在N3337草案[5]中,这是C++11发布后的第一个标准草案,对C++11标准做了一些重要的修改,应用于C++11标准。