为什么这些 unicode 变量名称不能与 -fextended-identifiers 一起使用? «, » 和 ≠
Why doesn't these unicode variable names work with -fextended-identifiers? «, » and ≠
我听说在 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 ‘2’ in program
if (s ≠ t)
^
main.cpp:10:3: error: stray ‘1’ in program
main.cpp:10:3: error: stray ‘0’ in program
main.cpp:11:4: error: stray ‘2’ in program
cout « s;
^
main.cpp:11:4: error: stray ‘3’ in program
这是怎么回事?这些宏名称不应该与 -fextended-identifiers
一起使用吗?
C++ 标准要求(第 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.
和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
你的尖括号是0x300A和0x300B,不包括在内。不等于0x2260,也是不允许的。
G++ 在源代码中尚不支持 Unicode 字符:
值得注意的是,您的程序生成的错误是针对 UTF-8 编码的各个八位字节,而不是针对它们所代表的 Unicode 字符。 ≠
被视为三个字节:210
和 «
被视为两个字节:23
.
我听说在 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 ‘2’ in program
if (s ≠ t)
^
main.cpp:10:3: error: stray ‘1’ in program
main.cpp:10:3: error: stray ‘0’ in program
main.cpp:11:4: error: stray ‘2’ in program
cout « s;
^
main.cpp:11:4: error: stray ‘3’ in program
这是怎么回事?这些宏名称不应该与 -fextended-identifiers
一起使用吗?
C++ 标准要求(第 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.
和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
你的尖括号是0x300A和0x300B,不包括在内。不等于0x2260,也是不允许的。
G++ 在源代码中尚不支持 Unicode 字符:
值得注意的是,您的程序生成的错误是针对 UTF-8 编码的各个八位字节,而不是针对它们所代表的 Unicode 字符。 ≠
被视为三个字节:210
和 «
被视为两个字节:23
.