为什么 C++ 语言禁止使用某些可打印字符的 ALT 代码作为标识符?

问题描述 投票:0回答:1

考虑以下代码片段:

struct vec2 {
    int x;
    int y;
};

constexpr vec2 Up{0,1};
constexpr vec2 Down{0,-1};
constexpr vec2 Left{-1,0};
constexpr vec2 Right{1,0};

上面的代码片段编译没有问题,被认为是有效和正确的语法。

现在考虑以下被认为是非法或无效语法的演示:

struct vec2 {
    int x;
    int y;
};

constexpr vec2 ↑{0,1};   // Windows Alt Code: Alt+24 
constexpr vec2 ↓{0,-1};  // Windows Alt Code: Alt+25
constexpr vec2 ←{-1,0};  // Windows Alt Code: Alt+27
constexpr vec2 →{1,0};   // Windows Alt Code: Alt+26

Compiler Explorer 给出了这些编译器错误:

  • 对于 x64 msvc v19.latest 它给出了编译器错误:
    C3872
  • 对于 x86-64 gcc(trunk) 状态:扩展字符不是有效标识符
  • 对于 x86-64(中继)状态:意外字符 - 不合格的 id

我知道他们作为标识符是不合格和无效的。我只是想弄清楚为什么它们被 C++ 语言禁止,标准对它们有什么规定,以及它在语言标准中的什么地方可以找到。阻止这些成为有效标识符的原因是什么?

c++ unicode language-design identifier alt-codes
1个回答
5
投票

箭头字符的代码点值为 U+2190 到 U+2193。

C++17 和 C++20 的 [lex.name] 表 2 中列出了标识符中允许的 UCS/Unicode 代码点(此处链接为 C++17 之前的草案 N4659),在所有先前版本(从 C++98 开始)的标准附件 E,以及 C++23 的 [lex.name]/1 中的 Unicode 标准附件 #31 参考(此处链接为当前草案)。

在这些范围内都没有被列为允许范围,因此编译器应该在字符/字符串文字之外将它们解析为非空白单字符预处理器标记,然后应该将其作为格式错误的标记拒绝。

代码点列表来源于JTC1/SC22/WG20的ISO/IEC 10176《

编程语言标准编写指南》。这里有 WG20 的文件注册.

快速浏览一下,我找不到任何关于具体包含箭头符号的范围的可访问讨论,但据我所知,这里的意图不是一般地扩展由数字、拉丁字母和

_

组成的传统标识符语法,但仅将此语法的“字母”部分国际化以允许在本机脚本中编写标识符,即除了传统代码点范围之外允许的代码点范围代表(大部分)不同语言的字母或脚本的其他部分,但不是标点符号。

我认为没有很多人支持将字符(序列)作为标识符,这些字符在视觉上更可能被视为标点符号、运算符或符号。特别是 C++23 中对 UAX #31 的更改导致标识符中不允许使用表情符号。根据相关提案

P1949 emoji 之所以被允许,是因为最初指定的标识符范围在指定时尚未分配。

© www.soinside.com 2019 - 2024. All rights reserved.