为什么这些 Unicode 变量名称不能与 -fextended- 标识符一起使用?"、"和≠
Why don'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 ‘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
一起使用吗?
G++ 在源代码中尚不支持 Unicode 字符:
- 在 GCC 中添加对标识符名称的 UTF-8 支持的状态如何?
值得注意的是,程序生成的错误是针对 UTF-8 编码的各个八位字节,而不是它们表示的 Unicode 字符。 ≠
被视为三个字节:342211240
,«
为两个:302253
。
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-EFFFD0300-036F, 1DC0-1DFF, 20D0-20FF, FE20-FE2F
尖括号0x300A和0x300B,不包括在内。 不等于是0x2260,也是不允许的。
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- #ifdef和未声明的标识符
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将C++中的库和头与MinGW一起使用
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我不能将 rand() 与数组的大小一起使用?
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 将fold表达式与std::一起用于两个元组
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- f2、f3、f4标识符未找到
- 将 std::allocate_shared 与多态资源分配器一起使用
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 设置 Visual Studio for MPI: 找不到标识符错误
- C 排序无法解析标识符开始和结束吗?(将数组保持在一起)
- 什么时候可以将"typename"与明确引用类型的标识符一起使用?
- 为什么这些 Unicode 变量名称不能与 -fextended- 标识符一起使用?"、"和≠
- 将未声明的标识符与模板和继承跟进一起使用