【问题标题】:I forgot what this is called?我忘了这叫什么?
【发布时间】:2013-09-23 16:58:44
【问题描述】:

好的,我有这段代码,我知道这不是好的编程习惯。我只是忘记它叫什么了。

int main()
{
    int variable; 
    {
        int variable;
    }
}

这是一个本地命名空间还是什么?我只是不记得做这种事情的正确术语了。

【问题讨论】:

标签: c++ namespaces scope


【解决方案1】:

这里有两个概念,一个是您在{ ... } 内创建block scope,您在此块范围内隐藏variable 的外部实例。如果我们查看 C++ 草案标准部分 6.3 复合语句或块 段落 1,则块范围是由复合语句(或块)创建的 语法如下:

compound-statement:
  { statement-seqopt}

它还说:

复合语句定义块作用域 (3.3)。

如果我们查看3.3.3 部分3.3.3 块范围 段落1 说:

在块 (6.3) 中声明的名称是该块的本地名称;它具有块范围。它的潜在范围从其声明点(3.3.2)开始,到其块的末尾结束。在块范围内声明的变量是局部变量。

所以variable 发生的事情是内部块中的本地副本是hiding 外部块中variable 的实例,因为它具有相同的名称。

【讨论】:

    【解决方案2】:

    { ... } 是一个复合语句,它创建一个嵌套的范围。 (这不是namespace。)

    这种特殊情况,即内部作用域中的声明与外部作用域中的声明具有相同名称(因此隐藏)有时称为遮蔽

    g++ 可以对此发出警告。引用the manual:

    `-Wshadow'
         Warn whenever a local variable or type declaration shadows another
         variable, parameter, type, or class member (in C++), or whenever a
         built-in function is shadowed. Note that in C++, the compiler will
         not warn if a local variable shadows a struct/class/enum, but will
         warn if it shadows an explicit typedef.
    

    (正如 Adam Rosenfield 在评论中指出的那样,-Wall-Wextra-pedantic 未启用 -Wshadow;您必须明确启用它。)

    【讨论】:

    • 请注意,-Wshadow 没有被-Wall-Wextra-pedantic 启用,因此必须手动将其添加为命令行选项;这很可能是因为它可能会为完美的代码生成大量误报。
    【解决方案3】:

    它被简单地称为变量的范围。c允许我们定义相同的变量名称变量。

    【讨论】:

      【解决方案4】:

      我认为您所指的是变量隐藏或变量阴影。通过在内部范围内声明一个与外部范围同名的变量,您将外部变量隐藏在内部范围之外。显然,在更复杂的代码中,这可能会令人困惑。

      http://en.wikipedia.org/wiki/Variable_shadowing

      【讨论】:

      • 只有在其他变量在全局命名空间中时才能这样做。
      • @Bathsheba:真的吗?所以你声称namespace Foo { int i; void Bar() { int i; } } 是不可能的?
      • MSalters;不,从那时起答案已被编辑。回答者说的是关于使用 ::.
      【解决方案5】:

      您正在遮蔽一个现有变量。这不是好的编程习惯。

      出于兴趣,Java 禁止它。

      【讨论】:

        【解决方案6】:

        我称之为作用域。我想这也是其他人所说的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-07-02
          • 1970-01-01
          • 2019-07-11
          • 2019-10-04
          • 2017-04-03
          • 2011-05-18
          • 2011-04-08
          相关资源
          最近更新 更多