$变量名?

时间:2011-10-28 07:38:25

标签: c++ variables visual-c++ identifier variable-names

我偶然发现了一些像这样的C ++代码:

int $T$S;

首先我认为它是某种PHP代码或者错误地粘贴在那里但它编译并运行得很好(在MSVC 2008上)。

哪些字符对C ++中的变量有效,是否还有其他可以使用的奇怪字符?

4 个答案:

答案 0 :(得分:29)

根据标准,唯一合法的字符是字母数字 和下划线。该标准确实需要几乎任何东西 Unicode认为字母是可以接受的(但只能是单一的 代码点字符)。在实践中,实现提供扩展 (即有些人接受$)和限制(大多数人不接受所有的 必需的Unicode字符)。如果您希望您的代码可移植, 将符号限制为26个非重音字母,大写或小写, 十位数字和'_'。

答案 1 :(得分:13)

我刚刚进行了搜索,发现这只在VC中有效,而不是C标准

  

Microsoft特定

     

只有Microsoft C ++标识符的前2048个字符才有意义。用户定义类型的名称由编译器“修饰”以保留类型信息。结果名称(包括类型信息)不能超过2048个字符。 (有关更多信息,请参阅装饰名称。)可能影响装饰标识符长度的因素包括:

     
      
  • 标识符是表示用户定义类型的对象还是从用户定义类型派生的类型。

  •   
  • 标识符是表示函数还是从函数派生的类型。

  •   
  • 函数的参数个数。

  •   
     

美元符号也是Visual C ++中的有效标识符。

// dollar_sign_identifier.cpp
struct $Y1$ {
    void $Test$() {}
};

int main() {
    $Y1$ $x$;
    $x$.$Test$();
}

https://msdn.microsoft.com/en-us/library/partnercenter/565w213d(v=vs.90).aspx
http://msdn.microsoft.com/en-us/library/565w213d.aspx


编辑: gcc也支持此扩展程序

  

6.34美元标识符名称

     

在GNU C中,您通常可以在标识符名称中使用美元符号。这是因为许多传统的C实现允许这样的标识符。但是,少数目标计算机不支持标识符中的美元符号,这通常是因为目标汇编程序不允许这些符号。

http://gcc.gnu.org/onlinedocs/gcc/Dollar-Signs.html#Dollar-Signs

答案 2 :(得分:2)

据我所知,只有字母(大写和小字母),数字09)和 {{1} 根据标准对变量名有效(注意:变量名不应以数字开头)。

所有其他字符应该是编译器扩展名。

答案 3 :(得分:0)

这不是一个好习惯。通常,您应该只在标识符 ([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++ 上,这确实可以编译,并且运行得很好。

更深层次

编译器获取源代码,将其词法转换为标记流,将其放入抽象语法树 (AST),然后使用它生成代码(例如汇编/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++ 不会将 $ 等字符视为特殊字符,因此它的处理方式与句点等其他字符不同。