【问题标题】:Access variable that was overwritten within given scope via function that uses global variables通过使用全局变量的函数访问在给定范围内被覆盖的变量
【发布时间】:2017-06-19 11:01:19
【问题描述】:

我有这段代码:

#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() 函数,使其显示main() 范围内的主要x 变量,如果未定义,则显示在main() 之外定义的变量?如果不可能,您能解释一下原因吗?谢谢

【问题讨论】:

  • 请澄清为什么我被否决了。谢谢
  • 函数内部的局部变量或 if/else、循环不能从外部访问。它不像命名空间。
  • @Raindrop7 “它不像命名空间”是什么意思。您可以发布一些链接或在答案中澄清这一点吗?

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


【解决方案1】:

为什么access_global() 不能访问main() 范围内的x

因为main::x 不在access_global 的范围内。幸运的是,名称不只是“泄漏”出函数的作用域。全局x 是它唯一能看到的x

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

不是你希望的那样,不。 main 中的名称与access_global 中的名称在任何意义上都没有关系。

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

像往常一样:因为标准是这样说的。为什么会这样有一些猜测,但是如果某些函数的含义根据调用上下文中存在的名称而改变,那肯定会非常令人困惑,这在编写时通常无法控制一个函数。

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

【讨论】:

    猜你喜欢
    • 2013-03-27
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 2013-12-25
    相关资源
    最近更新 更多