通过使用全局变量的函数在给定范围内覆盖的访问变量

时间:2017-02-02 11:31:50

标签: c++ c function scope global-variables

我有这段代码:

#include <stdio.h>

// global variable definition
int x = 0;

void access_global(){
    cout << "ACCESSING FROM access_global()" << endl;
    if (x > 0){
        cout << "LOCAL VARIABLE" << endl;
        cout << x << endl;
    }
    else{
        cout << "GLOBAL VARIABLE" << endl;
        cout << x << endl;
    }
}


int main(int, char*[])
{
    // declare new variable in given scope with same name as global variable
    int x = 1;

    cout << "ACCESSING FROM main()" << endl;
    if (x > 0){
        cout << "LOCAL VARIABLE" << endl;
        cout << x << endl;
    }
    else{
        cout << "GLOBAL VARIABLE" << endl;
        cout << x << endl;
    }

    access_global();

    return 0;
}

输出:

ACCESSING FROM main()
LOCAL VARIABLE
1
ACCESSING FROM access_global()
GLOBAL VARIABLE
0

为什么access_global()无法访问x范围内的main()? 是否可以修改access_global()函数,它将显示x范围内的主要main()变量,如果未定义,则显示main()之外定义的那些变量?如果不可能,请解释原因吗?感谢

1 个答案:

答案 0 :(得分:0)

  

为什么access_global()无法访问x范围内的main()

因为main::x不在access_global范围内。幸运的是,名称不仅仅是“漏掉”函数的范围。全局x是它可以看到的唯一x

  

是否可以修改access_global()函数,它将显示x范围内的主要main()变量,如果未定义,则显示main()之外定义的那些变量?

不是你想要的方式,不是。 main中的名称在任何意义上都与access_global中的名称无关。

  

如果不可能,请解释原因?

像往常一样:因为标准是这样说的。为什么会这样做会受到一些推测,但如果某些函数的含义根据调用上下文中存在的名称而改变,那么它肯定会非常混淆,这在写作时通常无法控制一个功能。

想想如果access_global从具有某些x的函数,甚至可能不是int类型的函数调用一次会发生什么,并且从某个没有函数的函数调用一次本地x:如果不查看所有呼叫者,您无法预测该功能的作用。这非常不切实际。