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

时间:2014-10-10 14:26:48

标签: c++ c++11 language-lawyer identifier

Are dollar-signs allowed in identifiers in C++03?涵盖了C ++ 03中不允许使用标识符中的美元符号。 GCC将其作为C extension提供,并在C ++ 03模式下正确提供诊断。但是,在C ++ 11中,int $ = 0将在没有警告的情况下进行编译。

可能允许$ a-z的原因,因为实现定义的标识符不需要诊断:

  

这里的答案是“可能”:根据§2.11,标识符   可能包含 digits identifier-nondigits ,从一开始   后者 identifier-nondigits 是常见的A-Z\uBEAF和   另外,自C ++ 11以来,它们包括在内   通用字符名称(例如\UC0FFEE32$),和其他实现定义的字符。所以它是实现定义的   如果允许在标识符中使用こんばんわ。 VC10及以上支持,   也许是早期版本。它甚至支持标识符   $

     

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

这种语言也存在于C ++ 03标准中,因此我认为这不是一个非常有说服力的论据。

§2.10/ 2

  

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

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

2 个答案:

答案 0 :(得分:19)

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

  1. 不能以数字开头
  2. 可以由字母,数字,下划线,通用字符名称和实现定义的字符组成
  3. 不能是keyword
  4. 允许使用

    实现定义的字符,并且许多编译器支持作为扩展,包括gccclangVisual Studio以及{{3}中所述显然是comment

    语法包含在DEC C++ compilers部分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
    [...]
    

    如果我们使用带有clang标志的-pedantic-errors编译此代码,则无法编译:

    int $ = 0
    

    并生成以下错误:

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

答案 1 :(得分:3)

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