【问题标题】:Uncovering shadowed variable when outer variable is not global当外部变量不是全局变量时发现阴影变量
【发布时间】:2019-03-23 10:32:36
【问题描述】:

我在this post 中看到,我们可以通过使用extern 和复合语句来发现一个全局变量,其中同名的局部变量在范围内。

在那篇文章中,给出的例子是这样的

#include<stdio.h>
int a = 12;             
int main(void)          
{           
    int a = 15;             
    printf("Inside a's main local a = : %d\n", a);

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

    return 0; 
}

阴影变量是全局变量。

但是当我尝试像这样的程序时

#include<stdio.h>
int main()
{
    int i=5;
    for(int i=0; i<2; ++i)
    {
        {
            extern int i;
            printf("\nGlobal: %d", i);
        }
        printf("\nLocal: %d", i);
    }
}

失败了。

我尝试将外部 i 设为静态,以防它仅在外部变量为静态但仍不起作用时才有效。

谁能告诉我为什么第二个程序不起作用?如果可能的话,如何绕过它?

也许这种方法只有在外部变量是全局变量时才有效?

编辑:cmets 让我意识到使用extern 只会使全局变量可见。但是有没有办法在不改变变量名的情况下解决这个问题?

【问题讨论】:

  • 不一样:int i=5; 是本地作用域,你不能使它成为extern。如果你把它设为static,它仍然在本地范围内。
  • extern 不会“向上一级”。我进入全局范围,因此您的i 必须在全局范围内声明。你的编译器应该已经抱怨了。
  • @PaulOgilvie 哦,我明白了。那么如果它是一个非全局变量,就没有办法解决了吗?
  • 不要。只需使用唯一的变量名称。
  • 由于编译器将“i”的第一个实例视为未使用,因此在生成的目标文件中将其消除。所以调用链接器时不存在。

标签: c scope global-variables local-variables


【解决方案1】:

在下面的代码快照中

#include<stdio.h>
int main()
{
    int i=5;
    for(int i=0; i<2; ++i)
    {
        {
            extern int i; /* just declaration */
            printf("\nGlobal: %d", i);
        }
        printf("\nLocal: %d", i);
    }
}

因为linker无法找到i的定义而失败。

克服这个问题的一种方法是

#include<stdio.h>
int main()
{
    int i=5; /* linker will not search this for definition of i */
    for(int i=0; i<2; ++i)
    {
        {
            extern int i; /* search definition other than this translation unit */
            printf("\nGlobal: %d", i);
        }
        printf("\nLocal: %d", i);
    }
}
int i = 100; /* this is the definition of extern i */

其他方法是在不同的文件中提供extern 变量i 的定义。理想情况下,extern 用于外部链接,即在其他文件中,而不是在同一个文件中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 2019-07-24
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多