【问题标题】:Is _ (single underscore) a valid C++ variable name?_(单下划线)是有效的 C++ 变量名吗?
【发布时间】:2013-09-05 22:28:25
【问题描述】:

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

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

我可以期望它总体上编译吗?我读过answers about underscores as prefixes。但是如果下划线没有作为前缀呢?

【问题讨论】:

    标签: c++ standards variable-names


    【解决方案1】:

    是的,来自 C++ 编程语言,第 4 版:

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

    【讨论】:

    • 你可以从那句话中推断出答案是“是”,但最好这么说。
    【解决方案2】:

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

    所以,是的,它应该是可移植的。

    【讨论】:

    【解决方案3】:

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

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

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

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

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

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

    【讨论】:

    • 这(GNU gettext 约定)不与 C++ 命名规则冲突吗?我读到禁止以下划线开头的全局名称?
    • @Wolf:它们并不完全是禁止,但它们是保留的。是的,我相信 gettext 对 _ 的使用违反了 C 和 C++ 的要求——但只要实现实际上不使用 _,就不太可能导致实际问题。
    【解决方案4】:

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

    【解决方案5】:

    是的,它是一个有效的前缀。 运行

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    char* _ = "Hello World";
    cout << _ << endl; 
    return 0;
    }
    

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

    【讨论】:

    • 编译或运行它并不能确保符合标准或可移植性。
    • @WayneMcGee:除非您可以访问大量编译器 [尽管在某些编译器中可能会失败或成功,而相反的情况应该发生],或者要求编译器严格遵守标准 [同样,严格性可能会受到编译器错误的影响]。
    【解决方案6】:

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

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

    【讨论】:

    • (作为“评论”可能比作为“答案”更好;以减少被否决的风险)。我有时使用_ 来指示我不打算使用的输出参数。 string first_name; {string _; get_first_and_last_name(first_name,_); }
    • 这是一个 python 约定。
    猜你喜欢
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 2011-03-09
    • 2010-12-26
    • 2016-01-19
    • 2022-03-02
    • 2011-03-20
    相关资源
    最近更新 更多