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



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

在那篇帖子中,给出的例子就像

#include<stdio.h>
int a = 12;             
int main(void)          
{           
    int a = 15;             
    printf("Inside a's main local a = : %dn", a);
    {
        extern int a;
        printf("In a global a = %dn", 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只会使全局变量可见。但是有没有办法在不更改变量名称的情况下解决这个问题?

在下面的代码快照中

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

相关内容

  • 没有找到相关文章

最新更新