_(单个下划线)是一个有效的C ++变量名吗?

时间:2013-09-05 22:28:25

标签: c++ standards variable-names

使用gcc 4.7.2这对我编译很好:

int main()
{
  int _ = 1;
  return 0;
}

我可以期待这个编译吗?我看过answers about underscores as prefixes。但是,如果下划线不是前缀任何东西呢?

6 个答案:

答案 0 :(得分:14)

根据Stroustrup(第3版,第4.9.3节),标识符由一系列字母和数字组成。第一个字符必须是一个字母。下划线字符被认为是一封信。

所以,是的,它应该是可携带的。

答案 1 :(得分:11)

  

名称(标识符)由一系列字母和数字组成。该   第一个字必须是一个字母。下划线字符_是   被认为是一封信。

来自C ++编程语言,第4版。

答案 2 :(得分:11)

是的,_是有效的标识符,因为它符合语法要求。基本上,标识符由下划线或字母组成,后跟零个或多个其他字符,可以是下划线,字母或数字。 (从C ++ 2011开始,标识符还可以包含通用字符名称和其他实现定义的字符,但这与您的问题无关。)

但是你可能不应该在你自己的代码中使用它,除非你非常小心。

正如this answer所说,引用了2003 C ++标准:

  

以下划线开头的每个名称都保留给   实现用作全局命名空间中的名称。

您的_变量不在全局命名空间中,因此在这种情况下您是安全的,但最好避免定义以下划线开头的任何标识符。< / p>

另外,我相信GNU gettext(提供对本地化消息的支持)使用名称_用于其自身目的。 (对于GNU gettext来说,这可能是一个坏主意,但这是一个方便的选择。)

答案 3 :(得分:3)

是。单个_将被接受为变量或任何标识符/命名空间名称!例如。 google mock使用此功能。

答案 4 :(得分:0)

是的,这是一个有效的前缀。 正在运行

#include <iostream>

using namespace std;

int main()
{
char* _ = "Hello World";
cout << _ << endl; 
return 0;
}

按预期打印出“Hello World”。它不是一个非常有用的变量名称,但它是有效的

答案 5 :(得分:0)

但是为什么变量有这个奇怪的名字“_”?这是否意味着您不希望任何人再次访问它或其他什么? 看到的代码如下:

for (auto _ : <range based container>) {
    // some code that does not use '_' at all
}