C++ 11是否允许标识符中的美元符号?

21 c++ identifier language-lawyer c++11

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

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

这里的答案是"可能":根据§2.11,标识符可以由数字标识符 - 非数字组成,从后者之一开始.标识符非数字是通常的a-z,A-Z并强调,除了因为C++ 11它们包括 通用字符-名称(例如\uBEAF,\UC0FFEE32),和其他执行定义的字符.因此,如果$允许在标识符中使用,则它是实现定义的.VC10及以上版本也支持早期版本.它甚至支持标识符 ?????.

但是:我不会用它们.使标识符尽可能可读和可移植.$是实现定义的,因此不可移植.

这种语言也存在于C++ 03标准中,因此我认为这不是一个非常令人信服的论点.

§2.10/ 2

此外,一些标识符保留供C++实现和标准库(17.6.4.3.2)使用,否则不得使用; 无需诊断.

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

Sha*_*our 20

这是实现定义的行为,$不包括在标识符的语法中.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
[...]
Run Code Online (Sandbox Code Playgroud)

如果我们使用编译此代码clang-pedantic-errors标志也不会编译:

int $ = 0
Run Code Online (Sandbox Code Playgroud)

并生成以下错误:

error: '$' in identifier [-Werror,-Wdollar-in-identifier-extension]
int $ = 0;
    ^
Run Code Online (Sandbox Code Playgroud)