22

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

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

我可以期望它一般编译吗?我已经阅读了关于下划线作为前缀的答案。但是,如果下划线没有任何前缀怎么办?

4

6 回答 6

18

是的,来自 The C++ Programming Language,第 4 版:

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

于 2013-09-05T22:32:27.883 回答
15

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

所以,是的,它应该是便携式的。

于 2013-09-05T22:32:29.257 回答
12

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

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

正如这个答案所说,引用 2003 C++ 标准:

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

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

另外,我相信 GNU gettext(它为本地化消息提供支持)使用该名称_是出于自己的目的。(GNU gettext 这样做可以说是一个坏主意,但这是一个方便的选择。)

于 2013-09-05T22:53:54.090 回答
3

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

于 2013-09-05T22:33:20.210 回答
0

是的,这是一个有效的前缀。跑步

#include <iostream>

using namespace std;

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

按预期打印出“Hello World”。这不是一个很有帮助的变量名,但它是有效的

于 2013-09-05T22:35:59.730 回答
0

但是为什么要为变量取这个奇怪的名字'_'呢?这是否意味着您不希望任何人再次访问它或其他什么?看到代码看起来像:

for (auto _ : <range based container>) {
    // some code that does not use '_' at all
}
于 2021-01-05T21:57:27.483 回答