不允许clang中变量名中的Unicode/特殊字符?

Posted

技术标签:

【中文标题】不允许clang中变量名中的Unicode/特殊字符?【英文标题】:Unicode/special characters in variable names in clang not allowed? 【发布时间】:2014-10-30 18:02:25 【问题描述】:

此问题的 unicode 文本可能无法在所有浏览器中正确显示。

clang 现在 (>3.3) 支持 变量名称中的 unicode 字符 http://llvm.org/releases/3.3/tools/clang/docs/ReleaseNotes.html#major-new-features。

但是一些特殊字符仍然被禁止。

int main()
    double α = 2.; // alpha, ok!
    double ∞ = 99999.; // infinity, error

给予:

error: non-ASCII characters are not allowed outside of literals and identifiers
        double ∞ = 99999.;

α(alpha)和(infinty)对于clang的根本区别是什么?前者是unicode,后者不是unicode,但同时不是ASCII吗?

是否有解决方法或选项允许clang 中的这组字符(或gcc 中的顺便说一句)?

注意:1) 只是一个例子,有很多可能有用但也被禁止的字符,如。 2)我不是在问这是否是个好主意,请把它当作一个技术问题。 3)我对Linux中clang 3.4的C++编译器感兴趣(gcc 4.8.3不支持这个)。我正在使用UTF-8 编码和Unix/Linux 行结尾使用gedit 保存源文件。 4)添加其他正常的第一个字符没有帮助:_∞


答案指向一个明确的否定。有些范围确实不是 允许也不会很快。向总数进一步移动一步 疯狂,我发现最好的选择是使用 实际上看起来相同的字符。 (现在,this 我可能承认这不是一个好主意。)可以在此处找到这些替代方案 http://shapecatcher.com/。结果(对不起,如果它伤害了你的眼睛):

//    double ∞ = 99999.; // still error
//    double ⧞ = 99999.; // infinity negated still error
  double ꝏ = 99999.; // letter oo
  double Ꝏ = 99999.; // letter OO
//    double ⧜ = 99999.; // incomplete infinity still error

问题中提到的在允许范围内的其他“替代”死铃声:ʃ????????????????

【问题讨论】:

这些名字是个糟糕的主意。你想达到什么目的?某种混淆竞赛?? @stefan:大概是编写看起来像数学符号的代码。如果目标受众是数学家,这不是一个坏主意。 @MikeSeymour 我是一名数学家,我讨厌它;-) 但很公平.. 虽然它是不可移植的。这是最大的缺点。 @stefan 我不认为double const π = 3.14159265359; 是在正确的上下文中使用的混淆。不可移植性是另一个问题,它是答案的一部分,毕竟标准似乎以有限的方式允许它。 【参考方案1】:

所以clang 文件说(强调我的):

此功能允许标识符包含某些 Unicode 字符, 按照现行语言标准的规定

这在draft C++ standard 附件E中有介绍,允许的字符如下:

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-EFFFD

infinity 221E 的代码不包含在列表中。

供参考:这些是上面转换为 unicode 字符的代码(其中一些可能无法在所有浏览器/可用字体中正确显示)。

¨, ª, ­,

¯, ²-µ, ·-º, ¼-¾, À-Ö, Ø-ö, ø-ÿ

Ā-ᙿ, ᚁ-᠍, ᠏-῿ ​-‍, ‪-‮, ‿-⁀, ⁔,

⁠- ⁰-↏, ①-⓿, ❶-➓, Ⰰ-ⷿ, ⺀-⿿

〄-〇, 〡-〯, 〱-〿

぀-퟿ 豈-ﴽ, ﵀-﷏,

ﷰ-﹄, ﹇-�

?-?, ?-?, ?-?, ?-?, ?-?, ?-?, ?-?, ?-?, ?-?, ?-?, ?-?, ?-?, ?-?, ?-?

尽管N3146: Recommendations for extended identifier characters for C and C++ 确实提供了有关影响的一些详细信息,但我找不到涵盖所选范围基本原理的详尽文档。

【讨论】:

如果您不介意,我使用此工具 rishida.net/tools/conversion 将您的代码转换为您的答案中的表示形式。谢谢。 你知道选择这些字符范围的标准吗? @alfC 我觉得我以前看到过一个基本原理,但我再也找不到了。我能够找到一份涉及许多影响并提到一些基本原理但细节较少的文件。我将其添加到我的答案中。

以上是关于不允许clang中变量名中的Unicode/特殊字符?的主要内容,如果未能解决你的问题,请参考以下文章

clojure jdbc postgres:为啥我的查询结果将表名中的 unicode 字符返回为 �?

变量名中是否不再允许有空格

通过存储在 Postgresql 中带有特殊字符的变量名中来删除约束

从 PHP 生成 SQL 时如何处理 SQL 表名中的特殊字符?

python-语言元素

变量 args SFINAE 默认构造函数在 clang 中工作,但在 Visual Studio 2015 中失败