直接在character-literal中输入unicode而不是使用universal-character-name是

Is it illegal directly putting in unicode in character-literal instead of using universal-character-name?

本文关键字:universal-character-name unicode character-literal 输入      更新时间:2023-10-16

根据ISO/IEC 14882:2011(§2.14.3),字符字面量也称为常量,如下所示。

character-literal:
    ’ c-char-sequence ’
    u’ c-char-sequence ’
    U’ c-char-sequence ’
    L’ c-char-sequence ’
...
c-char:
    any member of the source character set except
        the single-quote ’, backslash , or new-line character
    escape-sequence
    universal-character-name

乍一看,似乎直接在character-literal中使用unicode而不是universal-character-name是非法的。然而,大多数编译器(如g++和visual studio c++)根本不使用它,这有点令人困惑。无论标准如何,每个实现是否在编译开始之前自动将这些unicode转换为universal-character-name ?

我认为第一个"翻译阶段"处理的是(c++ 11 2.2/1:1.):

任何不在基本源字符集(2.3)中的源文件字符将被指定该字符的通用字符-name替换。

所以你的输入文件是在源字符集中编码的,其中包括基本的源字符集,但是在程序文本中,所有的非基本字符都被它们的通用字符-name代替。

它是实现定义的:

§2.2翻译阶段:
  1. […接受的物理源文件字符集是由实现定义的。[…任何源文件字符不在基本源字符集(2.3)被指定该字符的通用字符-name取代。(实现可以使用任何内部编码,只要是实际的扩展字符在源文件中遇到的,并且在源文件中表示为universal-character-name(即使用uXXXX表示法)的处理方式与[…]相同。