C++标识符中的Unicode字符

这其实是我的课程作业,但是因为确实解决了我的一大疑惑和内容比较充实,所以发到这里。


在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_Start:根据NFKC修改[3]ID_Start派生
  • XID_Continue:根据NFKC修改[3:1]ID_Continue派生

这里XID_中的X表示Extended(笔者个人意见),实际意义就是其从ID_中经过NFKC(Normalization Form Compatibility Composition)派生。在表格中,同样给出了ID_属性的说明和覆盖范围:

  • ID_Start

    • 大小写字母
    • titlecase letters(似乎与希腊语有关,这里因为和“大写字母”翻译重合不再翻译)
    • modifier letters(同上,但似乎不是希腊语)
    • other letters(同上)
    • letter numbers(同上,类似于各种语言的罗马数字)
    • Pattern_SyntaxPattern_White_Space[4]Other_ID_Start
  • ID_Continue

    • 符合ID_Start属性的字符
    • 非间距标记
    • 间距组合标记
    • 数字
    • 连接符标点
    • Pattern_SyntaxPattern_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标准。


  1. Identifiers - cppreference.com ↩︎

  2. UAX #31: Unicode Identifiers and Syntax ↩︎

  3. UAX #31: Unicode Identifiers and Syntax ↩︎ ↩︎

  4. UAX #31: Unicode Identifiers and Syntax ↩︎ ↩︎

  5. 14882: Contents (timsong-cpp.github.io) ↩︎

留言评论

0条搜索结果。