C++11是否允许在标识符中使用美元符号

Does C++11 allow dollar signs in identifiers?

本文关键字:美元 符号 标识符 是否 C++11      更新时间:2023-10-16

C++03中的标识符中是否允许使用美元符号?涵盖了在C++03中不允许使用标识符中的美元符号。GCC将其作为C扩展提供,并在C++03模式下正确地给出诊断。然而,在C++11中,int $ = 0将在没有警告的情况下编译。

这个答案说明$可能被允许,因为实现定义的标识符不需要诊断:

这里的答案是"也许":根据§2.11,标识符可以由标识符非数字组成,从一开始后者标识符非数字是常见的a-zA-Z和下划线,此外,由于C++11,它们还包括通用字符名(例如uBEAFUC0FFEE32)、和其他实现定义的字符。所以它是由实现定义的如果允许在标识符中使用CCD_ 7。VC10及以上支持,也许还有更早的版本。它甚至支持诸如こんばんわ

但是:我不会使用它们。使标识符尽可能具有可读性和可移植性。$是实现定义的,因此不是便携式的

C++03标准中也有这种语言,所以我觉得这不是一个很有说服力的论点。

§2.10.2

此外,一些标识符被保留以供C使用++实现和标准库(17.6.4.3.2)以其他方式使用;不需要进行诊断。

标准中的哪些变化允许$用作标识符名称?

这是实现定义的行为,$不包含在标识符的语法中。C++11中的标识符名称规则为:

  1. 它不能以数字开头
  2. 可以由字母、数字、下划线、通用字符名和实现定义的字符组成
  3. 不能是关键字

允许使用实现定义的字符,并且许多编译器都支持将其作为扩展,包括gcc、clang、Visual Studio,正如注释中所述,显然是DEC C++编译器。

C++标准草案2.11标识符中介绍了语法,我添加了以<-:开头的附加注释

identifier:
  identifier-nondigit            <- Can only start with a non-digit
  identifier identifier-nondigit <- Next two rules allows for subsequent 
  identifier digit               <-  characters to be those outlined in 2 above
identifier-nondigit:
  nondigit                       <- a-z, A-Z and _ 
  universal-character-name
  other implementation-defined characters
[...]

如果我们使用带有-pedantic-errors标志的clang编译此代码,它将不会编译:

int $ = 0

并生成以下错误:

error: '$' in identifier [-Werror,-Wdollar-in-identifier-extension]
int $ = 0;
    ^

我不这么认为。美元符号是ASCII 0x24,不在标准附录E.1(charname.allowed)中定义的任何范围内。由于它既不是数字也不是非数字,所以它必须是实现定义的字符。因此,我认为这不是可移植的C++11。还要注意,标识符不应以通用字符开头,而它允许标识符以实现允许的字符开头。