C++ C++;11允许在标识符中使用美元符号?

C++ C++;11允许在标识符中使用美元符号?,c++,c++11,language-lawyer,identifier,C++,C++11,Language Lawyer,Identifier,说明C++03中不允许在标识符中使用美元符号。GCC将其作为一个诊断工具提供,并在C++03模式下正确地给出诊断。但是,在C++11中,int$=0将在没有警告的情况下编译 这导致可能允许$,因为实现定义的标识符不需要诊断: 这里的答案是“可能”:根据§2.11,标识符 可能由数字和标识符非数字组成,以1开头 后者。非数字标识符通常为a-z、a-z和 下划线,此外,自C++11以来,它们还包括 通用字符名(例如\uBEAF,\UC0FFEE32),和其他实现定义的字符。所以它是实现定义的 如果允

说明C++03中不允许在标识符中使用美元符号。GCC将其作为一个诊断工具提供,并在C++03模式下正确地给出诊断。但是,在C++11中,
int$=0
将在没有警告的情况下编译

这导致可能允许
$
,因为实现定义的标识符不需要诊断:

这里的答案是“可能”:根据§2.11,标识符 可能由数字和标识符非数字组成,以1开头 后者。非数字标识符通常为
a-z
a-z
和 下划线,此外,自C++11以来,它们还包括 通用字符名(例如
\uBEAF
\UC0FFEE32
),和其他实现定义的字符。所以它是实现定义的 如果允许在标识符中使用
$
。VC10及以上版本支持这一点, 也可能是更早的版本。它甚至支持标识符,比如
こんばんわ

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

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

§2.10/2

另外,一些标识符是为C语言保留的++ 实施和标准库(17.6.4.3.2)以及 以其他方式使用;无需诊断


标准中有什么变化允许将
$
用作标识符名称?

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

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

  • 它不能以数字开头
  • 可以由字母、数字、下划线、通用字符名和实现定义的字符组成
  • 不可能是
  • 允许使用实现定义的字符,并且许多编译器支持将其作为扩展,包括,
    clang
    ,如图1所示


    <语法>在代码< > 2.11代码>代码>缩进符中,我从代码< > CouangWangon警告添加了附加注释。@ SaFik足够混乱地链接到旧的GCC文档,明确地表明C++在标识符中禁止<代码> $<代码>。他们将其移动到只带有标识符中的描述
    接受“$”。
    历史上,DEC在其所有系统服务和库函数名称中使用$,在其所有内部函数中使用$$。所有DEC编译器要么允许扩展名$symbol名称,要么允许pragmas进行映射(与ADA一样)。在GCC4.9.2中,我发现除了第一个字符外,似乎还允许$。这真让我吃惊。最近,我第一次看到这个应用是在。我查看了源代码,以了解美元符号究竟是如何得到支持的。令人惊讶的是:天生的!但是,显然,应该避免使用美元,因为它似乎不是标准的或便携的。(另一方面,GCC不喜欢..Boo!)“不可移植”和“不允许”(格式错误)都是不好的东西,但并不相同。所以这不是对这个问题的直接回答。我很清楚这一点。我在这里使用“不可移植”作为“实现定义的行为”的同义词。
    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
    [...]
    
    int $ = 0
    
    error: '$' in identifier [-Werror,-Wdollar-in-identifier-extension]
    int $ = 0;
        ^