gcc 为什么这些Unicode变量名不能与-fextended- identifiers一起使用?《,》且辛[重复]

jqjz2hbq  于 2023-05-07  发布在  其他
关注(0)|答案(2)|浏览(209)

此问题已在此处有答案

😃 (and other Unicode characters) in identifiers not allowed by g++(3个答案)
7年前关闭。
我听说在GCC中可以使用-fextended-identifiers标志来使用Unicode变量名。所以我用C++做了一个测试程序,但是它不能编译。

#include <iostream>
#include <string>

#define ¬ !
#define ≠ !=
#define « <<
#define » >>

/* uniq: remove duplicate lines from stdin */
int main() {
    std::string s;
    std::string t = "";
    while (cin » s) {
        if (s ≠ t)
            cout « s;
        t = s;
    }
    return 0;
}

我得到这些错误:

g++ -fextended-identifiers -g3 -o a main.cpp
main.cpp:10:3: error: stray ‘\342’ in program
   if (s ≠ t)
   ^
main.cpp:10:3: error: stray ‘\211’ in program
main.cpp:10:3: error: stray ‘\240’ in program
main.cpp:11:4: error: stray ‘\302’ in program
    cout « s;
    ^
main.cpp:11:4: error: stray ‘\253’ in program

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

u59ebvdq

u59ebvdq1#

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

  • 在GCC中为标识符名称添加UTF-8支持的情况如何?

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

ih99xse1

ih99xse12#

C++标准要求(第2.10节):
标识符是一个任意长的字母和数字序列。**标识符中的每个通用字符名称应指定其在ISO 10646中的编码福尔斯E.1中规定的范围之一的字符。**起始元素不应是指定其编码落入E.2中规定的范围之一的字符的通用字符名称。大写字母和小写字母是不同的。所有字符都是有效的。
和E.1:

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

  • 00A8、00AA、00AD、00AF、00B2-00B5、00B7-00BA、00BC-00BE、00C0-00D6、00D8-00F6、00F8-00FF
  • 0100-167F、1681-180D、180F-1FFF
  • 200B-200D、202A-202E、203F-2040、2054、2060-206F
  • 2070-218F、2460-24FF、2776-2793、2C00-2DFF、2E80-2FFF
  • 3004-3007、3021-302F、3031-303F
  • 3040-D7FF
  • F900-FD3D、FD40-FDCF、FDF0-FE44、FE47-FFFD
  • 10000-1FFFD、20000-2FFFD、30000-3FFFD、40000-4FFFD、50000-5FFFD、60000-6FFFD、70000-7FFFD、80000-8FFFD、90000-9FFFD、A0000-AFFFD、B0000-BFFFD、C0000-CFFFD、D0000-DFFFD、E0000-EFFFD 0300-036F、1DC0-1DFF、20D0-20FF、FE20-FE2F

尖括号是0x 300 A和0x 300 B,不包括在内。不等于0x 2260,也是不允许的。

相关问题