3

-fextended-identifiersのフラグを使用して、Unicode 変数名を使用できると聞きました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 で指定された範囲の 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-CF0FFD DFFFD、E0000-EFFFD 0300-036F、1DC0-1DFF、20D0-20FF、FE20-FE2F

山かっこは 0x300A と 0x300B であり、含まれていません。等しくないのは 0x2260 で、これも許可されていません。

于 2015-09-26T16:21:16.260 に答える