为什么这些 Unicode 变量名称不能与 -fextended- 标识符一起使用?“, “ 和 ?

wef*_*fa3 5 c++ unicode gcc variable-names

我听说可以使用 Unicode 变量名-fextended-identifiersGCC 中的标志来使用 Unicode 变量名。所以我用C++编写了一个测试程序,但它无法编译。

\n
#include <iostream>\n#include <string>\n\n#define \xc2\xac !\n#define \xe2\x89\xa0 !=\n#define \xc2\xab <<\n#define \xc2\xbb >>\n\n/* uniq: remove duplicate lines from stdin */\nint main() {\n    std::string s;\n    std::string t = "";\n    while (cin \xc2\xbb s) {\n        if (s \xe2\x89\xa0 t)\n            cout \xc2\xab s;\n        t = s;\n    }\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我收到这些错误:

\n
#include <iostream>\n#include <string>\n\n#define \xc2\xac !\n#define \xe2\x89\xa0 !=\n#define \xc2\xab <<\n#define \xc2\xbb >>\n\n/* uniq: remove duplicate lines from stdin */\nint main() {\n    std::string s;\n    std::string t = "";\n    while (cin \xc2\xbb s) {\n        if (s \xe2\x89\xa0 t)\n            cout \xc2\xab s;\n        t = s;\n    }\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

到底是怎么回事?这些宏名称不应该与 一起使用吗-fextended-identifiers?

\n

Ben*_*igt 5

G++ 还不支持源代码中的 Unicode 字符:

\n\n\n\n

值得注意的是,您的程序生成的错误是针对 UTF-8 编码的各个八位字节,而不是针对它们表示的 Unicode 字符。 \xe2\x89\xa0被视为三个字节:\\342\\211\\240和\xc2\xab两个:\\302\\253。

\n


Ben*_*igt 4

C++ 标准要求(第 2.10 节):

\n
\n

identi\xef\xac\x81er 是任意长的字母和数字序列。标识符中的每个通用字符名称应指定一个字符,其 ISO 10646 中的编码落入 E.1 中指定的范围之一。初始元素不应是指定其编码落入 E.2 中指定的范围之一的字符的通用字符名称。大写字母和小写字母是不同的。所有字符都很重要。

\n
\n

和 E.1:

\n
\n

允许的字符范围[charname.allowed]

\n
    \n
  • 00A8、00AA、00AD、00AF、00B2-00B5、00B7-00BA、00BC-00BE、00C0-00D6、00D8-00F6、00F8-00FF

    \n
  • \n
  • 0100-167F, 1681-180D, 180F-1FFF

    \n
  • \n
  • 200B-200D、202A-202E、203F-2040、2054、2060-206F

    \n
  • \n
  • 2070-218F、2460-24FF、2776-2793、2C00-2DFF、2E80-2FFF

    \n
  • \n
  • 3004-3007, 3021-302F, 3031-303F

    \n
  • \n
  • 3040-D7FF

    \n
  • \n
  • F900-FD3D、FD40-FDCF、FDF0-FE44、FE47-FFFD

    \n
  • \n
  • 10000-1FFFD、20000-2FFFD、30000-3FFFD、40000-4FFFD、50000-5FFFD、\n60000-6FFFD、70000-7FFFD、80000-8FFFD、90000-9FFFD、A0000-AFFFD、\nB0000-BFFFD、C0 000-CFFFD, D0000-DFFFD、E0000-EFFFD\n0300-036F、1DC0-1DFF、20D0-20FF、FE20-FE2F

    \n
  • \n
\n
\n

您的尖括号是 0x300A 和 0x300B,不包括在内。不等于0x2260,也是不允许的。

\n

  • @LightnessRacesinOrbit:在 C++ 中默认启用“-fextended-identifiers”,而“-fno-extended-identifiers”则破坏了标准合规性。 (2认同)