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

alf*_*lfC 6 c++ unicode gcc clang

此问题具有可能无法在所有浏览器中正确显示的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
}
Run Code Online (Sandbox Code Playgroud)

赠送:

error: non-ASCII characters are not allowed outside of literals and identifiers
        double ? = 99999.;
Run Code Online (Sandbox Code Playgroud)

?(alpha)和?(infinty)之间的根本区别是什么clang前者是unicode而后者不是unicode但同时不是ASCII?

是否有解决方法或选项允许这组字符clang(或BTW in gcc)?

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


答案指向肯定的NO.确实不允许某些范围,也不会很快.为了进一步向完全疯狂迈进,我发现的最佳选择是使用有效看起来相同的角色.(现在,这个我承认可能不是一个好主意.)这些替代可以在这里找到 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
Run Code Online (Sandbox Code Playgroud)

问题中提到的其他"替代"死亡铃声在允许的范围内:?,.

Sha*_*our 9

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

此功能允许标识符包含某些Unicode字符, 如活动语言标准所指定 ;

这包含在C++标准 附件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

无穷大的代码221E不包含在列表中.

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

¨, ª, ­,

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

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

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

?-?, ?-?, ?-?

?-? ?-?, ?-?,

?-?, ?-?

-, -, -, -, -, -, -, -, -, -, -, -, -, -
Run Code Online (Sandbox Code Playgroud)

虽然N3146:C和C++的扩展标识符字符的建议确实提供了有关影响的一些细节,但我找不到涵盖所选范围基本原理的大量文档.

  • @alfC 我觉得我以前见过一个理由,但我再也找不到了。我找到了一份文件,该文件探讨了许多影响并提到了一些基本原理,但细节很少。我将其添加到我的答案中。 (2认同)