有没有办法在C ++中访问外部作用域中的局部变量?

时间:2011-12-02 15:29:30

标签: c++ scope

出于好奇:如果我有嵌套的范围,就像在这个示例C ++代码

中一样
using namespace std;

int v = 1; // global

int main (void)
{
    int v = 2; // local
    {
        int v = 3; // within subscope
        cout << "subscope: " << v << endl;
        // cout << "local: " << v << endl; 
        cout << "global: " << ::v << endl;
    }
    cout << "local: " << v << endl;

    cout << "global: " << ::v << endl;

}

有没有办法从“中间”范围(全局或本地)访问值v的变量2

4 个答案:

答案 0 :(得分:17)

您可以将新引用声明为别名

int main (void)
{
    int v = 2; // local 
    int &vlocal = v;
    {
        int v = 3; // within subscope
        cout << "local: " << vlocal  << endl; 
    }
}

但我会完全避免这种做法。我花了好几个小时调试这样的构造,因为变量在调试器中显示为因为范围而改变了,我无法弄清楚它是如何被改变的。

答案 1 :(得分:7)

答案是否你不能。
局部范围内的变量会将变量隐藏在全局范围内,并且语言提供了一种通过使用全局限定名称来访问全局变量的方法。但是C ++作为一种语言无论如何都无法访问中间范围的变量。

考虑到它必须被允许,它需要大量复杂的处理,想象一下n个范围的情况(很可能是无限的)和处理它们。

最好重命名中间变量并使用那些更合理且易于维护的变量。

答案 2 :(得分:5)

C ++中有两种类型的scope resolution运算符 - 一元范围和一个类范围。没有函数范围或“任何特定父范围”解析运算符。这使得无法解决您的问题,因为它通常是因为您无法引用匿名范围。但是,您可以创建别名,重命名变量,或将其作为类的一部分,这当然意味着代码更改。这是我在没有重命名的情况下最接近你的情况:

#include <iostream>

using namespace std;

int v = 1; // global

class Program
{
    static int v; // local

public:
    static int main ()
    {
        int v = 3; // within subscope
        cout << "subscope: " << v << endl;
        cout << "local: " << Program::v << endl; 
        cout << "global: " << ::v << endl;
    }
};

int Program::v = 2;

int main ()
{
    return Program::main ();
}

还有其他方法,比如确保变量没有优化并且在堆栈中,然后你可以直接使用堆栈来获取你想要的变量的值,但是不要那样。

希望它有所帮助!

答案 3 :(得分:2)

你可以这样假装:

#include <iostream>
using namespace std;
int v = 1;

int main()
{
        int v = 2;
        {
                int &rv = v; // create a reference
                int v = 3; // then shadow it

                cout << "subscope: " << v << endl;
                cout << "local: " << rv << endl;
                cout << "global: " << ::v << endl;
        }
        cout << "local: " << v << endl;

        cout << "global: " << ::v << endl;

        return 0;
}

有趣的是,如果你试图运行它,这会编译cygwin g ++但会出现段错误:

#include <iostream>
using namespace std;
int v = 1;

int main()
{
        int v = 2;
        {
                int &v = v;
                cout << "subscope: " << v << endl;
                // cout << "local: " << v << endl; 
                cout << "global: " << ::v << endl;
        }
        cout << "local: " << v << endl;

        cout << "global: " << ::v << endl;

        return 0;
}