Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 直接在字符文字中输入unicode而不是使用通用字符名是否违法?_C++_C++11_Unicode - Fatal编程技术网

C++ 直接在字符文字中输入unicode而不是使用通用字符名是否违法?

C++ 直接在字符文字中输入unicode而不是使用通用字符名是否违法?,c++,c++11,unicode,C++,C++11,Unicode,根据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-qu

根据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
乍一看,直接输入unicode而不是在字符文字中使用通用字符名似乎是非法的。然而,大多数编译器,如G++和VisualStudioC++,都不需要用它来烦扰,这有点令人困惑。每个实现是否在编译开始之前自动将这些Unicode转换为通用字符名,而不考虑标准?

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

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


因此,您的输入文件在源字符集中编码,其中包括基本源字符集,但在程序文本中,所有非基本字符都被其通用字符名替换。

它的实现定义为:

§2.2翻译阶段:

  • […]接受的物理源文件字符集是实现定义的。[…]任何源文件字符不在基本格式中 源字符集(2.3)替换为指定该字符的通用字符名。(实现可以使用任何内部编码,只要是实际的扩展字符 在源文件中遇到,并且源文件中表示的扩展字符与 通用字符名(即使用\uxxx表示法)被等效处理[…]

  • “在编译开始之前,每个实现是否会自动将这些Unicode转换为通用字符名,而不考虑标准?”我不相信这一点,但我猜clang也支持它。@πάνταῥεῖ 我知道clang也支持它。然而,我在标准中找不到任何清晰的语句。这难道不取决于你的“源字符集”是什么吗?@KerrekSB我认为源字符集和基本源字符集是一样的。我错了吗?@user3647351:不幸的是,错了。看起来“源字符集”这个术语并没有被很清楚地强调,它只出现在几个语法规范中。其描述是实现定义的“接受的物理源字符集”(2.2/1)。