C++ C++;11允许在标识符中使用美元符号?
说明C++03中不允许在标识符中使用美元符号。GCC将其作为一个诊断工具提供,并在C++03模式下正确地给出诊断。但是,在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),和其他实现定义的字符。所以它是实现定义的 如果允
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;
^