如何在局部变量和全局变量冲突时访问全局变量

5

代码:

int a = 33;
int main()
{
  int a = 40; // local variables always win when there is a conflict between local and global.
  // Here how can i access global variable 'a' having value '33'.
}

如果你问:为什么有人想要做上述事情?为什么[a-zA-Z]*?
我的答案是:只是想知道“这是可能的”。
谢谢。

https://dev59.com/gm025IYBdhLWcg3wvIko - Ahmed Aeon Axan
这是一个很好的问题,但是 [a-zA-Z]* 是什么意思? - Grijesh Chauhan
2
它意味着任何以“为什么”开头并以“?”结尾的问题,例如:为什么你想在这里访问全局?或者为什么嘟嘟嘟嘟嘟? - VishalDevgire
@VishalD,明白了,请看我的答案,获取更多方法 :) - Grijesh Chauhan
3个回答

15

这个古老的技巧怎么样?

int main()
{
    int a = 40; // local variables always win when there is a conflict between local and global.

    {
        extern int a;
        printf("%d\n", a);
    }
}

3
谢谢你在30秒内赢过我,加一分。 - R.. GitHub STOP HELPING ICE
4
公平地说,我认为我在你的旧帖子中某个时候首次看到它。 - cnicutar
@cnicutar,您何时更喜欢通过指针访问而不是extern关键字?我认为这对于全局静态变量也适用。正确吗? - Grijesh Chauhan
1
@GrijeshChauhan 我认为最好的方法是通过谨慎地为代码导出的对象和函数命名(即除了“static”之外的所有内容)来避免首先发生名称冲突。另一方面,如果您已经有一个指针,那么就不需要使用这个技巧。 - cnicutar
它没有起作用,我正在使用DigitalMars编译器。 - void

11
int a = 33;
int main()
{
  int a = 40;
  int b;
  {
    extern int a;
    b = a;
  }
  /* now b contains the value of the global a */
}

更难的问题是如果 static 的变量在文件作用域内,如何获取它,但这也是可以解决的:

static int a = 33;
static int *get_a() { return &a; }
int main()
{
  int a = 40;
  int b = *get_a();
  /* now b contains the value of the global a */
}

为什么不直接这样写int b = a; int a = 40;?或者说,编译器会在这种情况下重新排序代码吗? - ad absurdum
确实,你可以这样做。 - R.. GitHub STOP HELPING ICE

4

这是C++,我忽略了C标签,非常抱歉!

int a = 100;

int main()
{
    int a = 20;

    int x = a; // Local, x is 20

    int y = ::a; // Global, y is 100

    return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接