当外部变量不是全局变量时,发现阴影变量

时间:2019-03-23 10:32:37

标签: c scope global-variables local-variables

我在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设为静态,以防仅当外部变量为静态但仍然无效时才起作用。

有人可以告诉我为什么第二个程序不起作用吗?以及如何解决它?

也许此方法仅在外部变量为全局变量时有效吗?

编辑:注释使我意识到使用extern只会使全局变量可见。但是,有没有办法解决此问题而不更改变量名?

1 个答案:

答案 0 :(得分:0)

在下面的代码快照中

#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);
    }
}

由于链接器无法找不到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用于外部链接,即在其他文件中,而不是在同一文件中。