我在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
只会使全局变量可见。但有没有办法改变变量名称?
在下面的代码快照中
#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
用于外部链接,即在其他文件中,而不是在同一文件中。