【问题标题】:Can I create variable name with non-ASCII characters in c++?我可以在 C++ 中使用非 ASCII 字符创建变量名吗?
【发布时间】:2020-03-28 11:00:50
【问题描述】:

我从 2010 年开始使用 C++ 编写代码。

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

我写了int й = 1;,它刚刚编译!

我错过了什么?


打赌,这可能是 c++ 11,14 或类似的功能。

【问题讨论】:

  • 不,那是视觉工作室接受特殊字符。 GCC 甚至不接受é,没关系й
  • Gcc 对非 ascii 字符的支持很差。

标签: c++ ascii


【解决方案1】:

如果您查看this paper 的附件 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

【讨论】:

    【解决方案2】:

    这是标准所说的([lex.phases]):

    如有必要,物理源文件字符以实现定义的方式映射到基本源字符集(为行尾指示符引入换行符)。 接受的物理源文件字符集是实现定义的。

    所以您的特定实现支持这一点,但不能保证可移植到任何其他实现。

    【讨论】:

      【解决方案3】:

      嗯,根据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 对此一无所知。

      【讨论】:

      • 不要使用cplusplus.com,使用cppreference.com
      • cplusplus.com 在准确性或完整性方面的声誉并不好。
      • @Shawn 许多俄罗斯网站都说它应该是非常拉丁文的。
      猜你喜欢
      • 2017-01-26
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 2017-02-14
      • 2011-01-01
      • 1970-01-01
      • 2012-09-10
      相关资源
      最近更新 更多