C++11是否允许在标识符中使用美元符号
Does C++11 allow dollar signs in identifiers?
C++03中的标识符中是否允许使用美元符号?涵盖了在C++03中不允许使用标识符中的美元符号。GCC将其作为C扩展提供,并在C++03模式下正确地给出诊断。然而,在C++11中,int $ = 0
将在没有警告的情况下编译。
这个答案说明$
可能被允许,因为实现定义的标识符不需要诊断:
这里的答案是"也许":根据§2.11,标识符可以由位和标识符非数字组成,从一开始后者标识符非数字是常见的
a-z
、A-Z
和下划线,此外,由于C++11,它们还包括通用字符名(例如uBEAF
、UC0FFEE32
)、和其他实现定义的字符。所以它是由实现定义的如果允许在标识符中使用CCD_ 7。VC10及以上支持,也许还有更早的版本。它甚至支持诸如こんばんわ
。但是:我不会使用它们。使标识符尽可能具有可读性和可移植性。
$
是实现定义的,因此不是便携式的
C++03标准中也有这种语言,所以我觉得这不是一个很有说服力的论点。
§2.10.2
此外,一些标识符被保留以供C使用++实现和标准库(17.6.4.3.2)以其他方式使用;不需要进行诊断。
标准中的哪些变化允许$
用作标识符名称?
这是实现定义的行为,$
不包含在标识符的语法中。C++11中的标识符名称规则为:
- 它不能以数字开头
- 可以由字母、数字、下划线、通用字符名和实现定义的字符组成
- 不能是关键字
允许使用实现定义的字符,并且许多编译器都支持将其作为扩展,包括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
[...]
如果我们使用带有-pedantic-errors
标志的clang
编译此代码,它将不会编译:
int $ = 0
并生成以下错误:
error: '$' in identifier [-Werror,-Wdollar-in-identifier-extension]
int $ = 0;
^
我不这么认为。美元符号是ASCII 0x24,不在标准附录E.1(charname.allowed)中定义的任何范围内。由于它既不是数字也不是非数字,所以它必须是实现定义的字符。因此,我认为这不是可移植的C++11。还要注意,标识符不应以通用字符开头,而它允许标识符以实现允许的字符开头。
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- vscode g++链路故障:体系结构x86_64的未定义符号
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 使用gcc从静态链接的文件中查找可选符号
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- 允许用户输入带或不带美元符号的金额
- c++:如何使用美元符号将双精度格式化为货币
- 将使用预处理器指令来定义美元符号表示的内容会导致任何冲突
- 读入美元金额(带美元符号)C++
- 美元符号在某种程度上与C++指针有关吗
- C++11是否允许在标识符中使用美元符号
- 变量名中的美元符号
- iomanip格式的多个输入和美元符号- c++
- 为什么在c++ /Java和类似的语言中用美元符号开始变量名是不好的?