变量名中的美元符号
Dollar sign in variable name
我偶然发现了一些这样的c++代码:
int $T$S;
首先,我认为这是某种PHP代码或错误地粘贴在那里的东西,但它编译和运行良好(在MSVC 2008上)。
在c++中什么类型的字符对变量是有效的,还有其他奇怪的字符可以使用吗?
唯一符合标准的合法字符是字母数字还有下划线。这个标准确实要求任何事情都是这样Unicode认为字母是可以接受的(但只能作为单个字符)码点字符)。在实践中,实现提供扩展(例如,有些接受$)和限制(大多数不接受所有的$)需要Unicode字符)。如果你希望你的代码是可移植的,将符号限制为26个无重音字母(大写或小写)十位数字,加上'_'
这是一些编译器的扩展,不在C标准中
<标题> MSVC:微软特定
只有Microsoft c++标识符的前2048个字符是重要的。用户定义类型的名称由编译器"修饰"以保留类型信息。生成的名称(包括类型信息)不能超过2048个字符。(请参阅装饰名称了解更多信息。)可以影响修饰标识符长度的因素有:
- 标识符是用户定义类型的对象还是用户定义类型的派生类型。
- 标识符是否表示函数或从函数派生的类型。
- 函数的参数数。
在Visual c++中,美元符号也是一个有效的标识符。
// dollar_sign_identifier.cpp struct $Y1$ { void $Test$() {} }; int main() { $Y1$ $x$; $x$.$Test$(); }
https://web.archive.org/web/20100216114436/http://msdn.microsoft.com/en-us/library/565w213d.aspx
最新版本:https://learn.microsoft.com/en-us/cpp/cpp/identifiers-cpp?redirectedfrom=MSDN&view=vs-2019
<标题> GCC:6.42标识符名称中的美元符号
在GNU C中,您通常可以在标识符名称中使用美元符号。这是因为许多传统的C实现允许这样的标识符。然而,在一些目标机器上不支持标识符中的美元符号,通常是因为目标汇编程序不允许它们。
http://gcc.gnu.org/onlinedocs/gcc/Dollar-Signs.html美元符号
标题>标题>据我所知,根据标准,只有字母(大写和小写),数字 (0
到9
)和 _
是有效的变量名(注意:变量名不应该以数字开头)。
这不是一个好的做法。通常,您应该只在标识符中使用字母数字字符和下划线([a-z][A-Z][0-9]_
)。
与其他语言(bash, perl)不同,C不使用$
来表示变量的使用。因此,它在技术上是有效的。在C语言中,它很可能属于C11, 6.4.2。这意味着它似乎被现代编译器所支持。
对于你的c++问题,让我们测试一下吧!
int main(void) {
int $ = 0;
return $;
}
在GCC/g++/Clang/clang++上,这确实可以编译,并且运行得很好。
更深层次
编译器获取源代码,将其lex到令牌流中,将其放入抽象语法树(AST)中,然后使用它来生成代码(例如assembly/LLVM IR)。你的问题实际上只围绕着第一部分(例如词法)。
C/c++的语法(因此词法分析器的实现)不将$
视为特殊的,不像逗号,句号,细箭头等…因此,您可以从词法分析器获得如下c代码中的输出:
int i_love_$ = 0;
在词法分析器之后,它变成如下的令牌蒸汽:
["int", "i_love_$", "=", "0"]
如果你要取这段代码:
int i_love_$,_and_.s = 0;
词法分析器将输出如下令牌蒸汽:
["int", "i_love_$", ",", "_and_", ".", "s", "=", "0"]
如您所见,由于C/c++不将$这样的字符视为特殊字符,因此它的处理方式与其他字符(如句号)不同。
- 在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和类似的语言中用美元符号开始变量名是不好的?