gcc Clang中的变量名是否不允许使用Unicode和特殊字符?

r9f1avp5  于 2023-05-07  发布在  其他
关注(0)|答案(1)|浏览(159)

Clang现在(〉3.3)支持 * 变量名 * 中的Unicode字符:*Clang 3.3发行说明,主要新功能 *。
然而,一些特殊的字符仍然被禁止。

int main(){
    double α = 2.; // Alpha, ok!
    double ∞ = 99999.; // Infinity, error
}

给出:

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

对于Clang,α(alpha)和(infinity)之间的基本区别是什么?前者是Unicode,后者不是Unicode,但同时也不是ASCII。
是否有解决方法或选项允许Clang中的这组字符(或GCC中的BTW)?

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

答案都指向一个明确的“不”。有些范围确实是不允许的,也不会很快被允许。为了更进一步达到完全疯狂,我发现最好的选择是使用有效地看起来相同的字符。(现在,我可能承认这不是一个好主意。)这些替代方案可以在这里找到http://shapecatcher.com/。结果(对不起,如果它伤害了你的眼睛):

//double ∞ = 99999.; // Still an error
//double ⧞ = 99999.; // Infinity negated. Still an error

double ꝏ = 99999.;   // Letter oo
double Ꝏ = 99999.;  // Letter OO

//double ⧜ = 99999.; // Incomplete infinity. Still an error

在允许范围内的问题中提到的其他“替代”死铃声:ʃ𝜕𝝏𝞉𝟃
注意:此问题包含Unicode文本,可能无法在所有浏览器中正确显示。

nmpmafwu

nmpmafwu1#

所以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
无穷大221E的代码未包含在列表中。

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

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

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

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

〄-〇, 〡-〯, 〱-〿

぀-퟿ 豈-ﴽ, ﵀-﷏,

ﷰ-﹄, ﹇-�

𐀀-🿽, 𠀀-𯿽, 𰀀-𿿽, 񀀀-񏿽, 񐀀-񟿽, 񠀀-񯿽, 񰀀-񿿽, 򀀀-򏿽, 򐀀-򟿽, 򠀀-򯿽, 򰀀-򿿽, 󀀀-󏿽, 󐀀-󟿽, 󠀀-󯿽

我找不到一个广泛的文件,涵盖了理由的范围选择,虽然N3146: Recommendations for extended identifier characters for C and C++确实提供了一些细节的影响。

相关问题