此问题已在此处有答案:
😃 (and other Unicode characters) in identifiers not allowed by g++(3个答案)
7年前关闭。
我听说在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 ‘\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条答案
按热度按时间u59ebvdq1#
G++在源代码中还不支持Unicode字符:
值得注意的是,程序生成的错误是针对UTF-8编码的单个八位字节,而不是针对它们表示的Unicode字符。
≠
被视为三个字节:\342\211\240
和«
为两个:\302\253
。ih99xse12#
C++标准要求(第2.10节):
标识符是一个任意长的字母和数字序列。**标识符中的每个通用字符名称应指定其在ISO 10646中的编码福尔斯E.1中规定的范围之一的字符。**起始元素不应是指定其编码落入E.2中规定的范围之一的字符的通用字符名称。大写字母和小写字母是不同的。所有字符都是有效的。
和E.1:
允许的字符范围
[charname.allowed]
尖括号是0x 300 A和0x 300 B,不包括在内。不等于0x 2260,也是不允许的。