我能在C++中使用非ASCII字符创建变量名吗?

3

我从2010年开始就一直在写C++。

我刚刚不小心在我的代码中输入了“й”字母,将鼠标悬停在上面以删除它,然后发现Visual Studio只是说没有变量“й”。

我写了int й = 1;,它竟然编译通过了!

我错过了什么?


我敢打赌这可能是C++11C++14之类的特性。


1
不,那是Visual Studio接受特殊字符。GCC甚至不接受é,更不用说й了。 - Neven V.
Gcc对非ASCII字符的支持较差。 - Oliv
3个回答

3
以下是翻译的结果:

以下是The Standard ([lex.phases])的说法:

物理源文件字符以一种实现定义的方式映射到基本源字符集中(如果需要,引入换行符作为行末指示符)。所接受的物理源文件字符集是由实现定义的。

因此,您特定的实现支持该功能,但不能保证可移植到任何其他实现中。


2

如果您查看本文的附录E,您会发现有一些Unicode范围允许用作变量名。这些范围包括:

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。

这些范围的特点是什么?主要字母表(如果有的话)是什么? - Peter Mortensen

0

看起来,根据MSDN的说法,定义标识符时似乎没有任何限制Unicode字符的使用:

struct テスト         // Japanese     'test'
{
    void トスト() {}  // Japanese      'toast'
};

 int main() {
      テスト \u30D1\u30F3;  // Japanese  パン 'bread' in UCN form
      パン.トスト();         //  Compiler recognizes UCN or literal form
 }

我很失望cplusplus.com没有提到这个。


请使用cppreference.com,而不是cplusplus.com。 - rustyx
2
cplusplus.com的准确性和完整性声誉并不好。 - Shawn
@Shawn,许多基于俄罗斯的网站都说在任何情况下都应该使用纯拉丁字母。 - Artur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接