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}}用作标识符名称?
答案 0 :(得分:19)
这是实现定义的行为,$
未包含在标识符的语法中。 C ++ 11 中标识符名称的规则是:
实现定义的字符,并且许多编译器支持作为扩展,包括gcc,clang
,Visual 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。另请注意,标识符不应以通用字符开头,而是允许标识符以实现允许的字符开头。