为什么这些unicode变量名不能与-fextended-identifiers一起使用? «,»和≠

时间:2015-09-26 16:02:39

标签: c++ gcc unicode variable-names

我听说可以使用-fextended-identifiers中的gcc标记来使用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吗?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

  •   

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