什么是ISO14882和ECMA335标准的有效标识符

What are valid Identifiers for ISO14882 and ECMA335 standards?

本文关键字:有效 标识符 标准 ECMA335 ISO14882 什么      更新时间:2023-10-16

标准最美的是有这么多。在阅读 C++11 标准与 CLI 标准(第 5 版(相比时,我对标识符命名有点困惑。

C++根据 [ISO/IEC 14882:2011 第 23 页] ASCI:_a-zA-Z0-9(无论顺序如何(和 [第 1249 页] 许多 unicode 字符 .. 没有定义 $ (0x24( 的地方。另一方面 [ECMA335分区 II 第 13 页] 允许a-zA-Z0-9_``@$作为标识符字符。

换句话说,C++不应支持标识符名称中的$ (0x24(,但 CLR 应支持。在测试这个时,我注意到恰恰相反:

  • 原生C++(原生MSVC [VS2010 Ultimate],GCC [2.8.1],minGW [最新](支持$;
  • C++\CLI 甚至 C# (MSVC( 都不支持 $

那么真相是什么呢?我在阅读标准时遗漏了什么吗?还是每个人都在做他想做的事情?

一个复杂的是,第2.2节说:

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

所以我们正式不知道源文件中的$对应于标识符中的美元符号。它只是可能映射到其他内容。

语言标准中的要求也是实现必须提供的最低要求。所有编译器都提供对标准语言的扩展。在标识符名称中允许额外的字符可能是这样的扩展,可能是为了支持旧的试行标准代码或某些特定于操作系统的功能。

面向 CLR 的语言没有理由支持 CLR 标识符中允许的所有字符。例如,C#不允许像$`这样的字符,并使用其中一些字符作为编译器生成的标识符。

我希望有一个C++实现,无论它是针对 CLR 还是普通汇编代码以使用 C++ 规范中的字符集。