用c ++语言阻止范围分辨率

时间:2014-05-15 17:36:54

标签: c++ scope


我正在用c ++程序进行练习,我在这里发布了一个给我提问的程序的一部分。

int max=100;
main()
{ int max=50;
 {
  int max=25;
  printf("%d",max);
  printf("%d",::max);
  //output will be 25 and 100
 // I wanted to use value "50" of max in this block i.e. the max variable of above block which is local to main
 // and I can't figure out how to do this.
 }
}

我知道::运算符会使用Global覆盖local的优先级,但是我希望将它用于一个块级别。请帮帮我。我在书中和互联网上看到了一些参考文献,实际上我确实倒退了(首先是互联网,然后是书籍),但我无法弄明白。请帮帮我。

我原来的代码是:

int max=100;
void main()
 {
   int max=50;
   char str[50];
   gets(str);
   if(strlen(str)>5)
    {
     int max=25;
     cout<<"Max here is"<<max<<endl;
     cout<<"Max above was"<</*max value of above block*/;
     cout<<"Max Global"<<::max;
    }
 }

2 个答案:

答案 0 :(得分:1)

这是不可能的。内部局部范围完全遮蔽外部嵌套范围名称。

您可以做的最好的事情是在遮蔽外部名称之前创建别名:

int max = 100;

int main() {
  int max = 50;
  {
    int &m_max = max; // make reference alias first!
    int max = 25;

    printf("%d %d %d\n", max, m_max, ::max); // have to use alias name :(
  }
}

答案 1 :(得分:0)

您不能在内部块中执行变量max visible的第二个声明,因为内部块中具有相同名称的变量会隐藏它。您只能将限定名称用于在名称空间或类作用域中声明的变量。 在您的示例中,您使用限定名::max来访问在全局名称空间中声明的变量。