范围解析运算符::可用于访问由局部声明隐藏的全局变量。对于在封闭范围内声明但不在全局范围内声明的变量,您如何实现相同的目的?

int main() {
  int i = 10;

  if (1) {
    int i = 5;
    std::cout << "Local i: " << i << std::endl;

    std::cout << "Main's i: " << ?? << std::endl; //How to access main's i?
  }

  return 0;
}

我知道这是不好的做法。但是我只是想知道这是否可行。我认为不是。

解释为什么不可能或怎么做将很有用。

最佳答案

不幸的是,这是不可能的。编译器警告选项,例如GCC的-Wshadow,可以帮助避免这种情况:



例如,在your example中,您将收到类似以下的警告:



正如@L. F.在下面的评论中指出的那样,您可以使用引用来访问其他i:

#include <iostream>

int main() {
  int i = 10;
  if (1) {
    int& nonlocal_i = i; // just before shadowing
    int i = 5;
    std::cout << "Local i: " << i << std::endl;
    std::cout << "Main's i: " << nonlocal_i  << std::endl;
  }
  return 0;
}

但是-Wshadow仍然会提示,并且如果您要花更多的精力来查找替代名称,则可以仅以不同的方式命名本地i

注意:
正如user4581301在评论中指出的那样,像int& i = i;这样的代码在内部作用域中并没有达到您的期望:
#include <iostream>

int main()
{
    int i = 4;
    {
        int& i = i;
        std::cout << i;
    }
}

它尝试使用变量i进行自身初始化。在Microsoft的编译器中,您会看到类似以下的编译错误:



在GCC中,如果打开所有警告,则会收到以下消息:



但是,如果您没有打开警告,它会默默地编译并执行错误的操作

关于c++ - 访问C++中局部声明隐藏的封闭范围(非全局)中的变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56783612/

10-09 01:21
查看更多