Search code examples
c++gccunicodevariable-names

Why don't these Unicode variable names work with -fextended- identifiers? «, » and ≠


I heard that it is possible to use Unicode variable names using the -fextended-identifiers flag in GCC. So I made a test program in C++, but it does not compile.

#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;
}

I get these errors:

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

What is going on? Aren't these macro names supposed to work with -fextended-identifiers?


Solution

  • The C++ Standard requires (section 2.10):

    An identifier is an arbitrarily long sequence of letters and digits. Each universal-character-name in an identifier shall designate a character whose encoding in ISO 10646 falls into one of the ranges specified in E.1. The initial element shall not be a universal-character-name designating a character whose encoding falls into one of the ranges specified in E.2. Upper- and lower-case letters are different. All characters are significant.

    And E.1:

    Ranges of characters allowed [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

    Your angle brackets are 0x300A and 0x300B, which are not included. Not equal is 0x2260, also disallowed.