3

我听说可以-fextended-identifiers使用gcc. 所以我用 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吗?

4

2 回答 2

4
于 2015-09-26T16:28:54.660 回答
3

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-DFFFD-C0000-CF DFFFD、E0000-EFFFD 0300-036F、1DC0-1DFF、20D0-20FF、FE20-FE2F

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

于 2015-09-26T16:21:16.260 回答