如何在C中访问具有相同名称的局部变量和全局变量
How to access local and global variable with same name in C
我在学校有这个作业,其中我必须找到以下 C 代码的输出,并且还要解释输出。
#include<stdio.h>
int i;
void fun1(void);
void fun2(void);
int main()
{
fun1();
fun2();
return 0;
}
void fun1(){
i=20;
printf("%d\t",i);
}
void fun2(){
int i=50;
printf("%d",i);
}
输出为 20 50
因为在 fun1() 中,全局变量 'i' 被分配给 20 并打印出来。在 fun2() 中,变量 'i' 是一个局部变量,它被声明并初始化为 50,然后被打印出来。
出于好奇,我有以下问题,如何在 fun2() 中使用全局变量 'i'?
一个简单的解决方案是简单地更改名称并避免整个事情。但我的好奇心是由于Java,其中有一个关键字“this”来访问class变量而不是局部变量。
那么在 C 中有什么方法可以做到这一点吗?
无法访问具有同名局部变量的函数内的全局参数。虽然如您所见,在 C 中创建此类局部变量通常是一种不好的做法,但并不禁止。
在 C++ 中,您可以使用名称空间解决它,但在 C 中没有等效项。
您可以在声明局部 i
之前欺骗并创建指向全局 i
的指针:
void fun2( void )
{
int *ip = &i; // get address of global i
int i = 50; // local i ”shadows" global i
printf( "local i = %d, global i = %d\n", i, *ip );
}
编辑
看到这个答案被接受了,我必须强调你应该永远不要写这样的代码。这是一个 band-aid 糟糕的编程实践。
尽可能避免使用全局变量,在不可能的地方使用 明确 将它们标记为全局变量且不太可能被隐藏的命名约定(例如使用前缀 g_
或类似的东西)。
我无法告诉你我浪费了多少时间来追查由于这样的命名冲突引起的问题。
唯一的办法是在代码块中隐藏局部变量的声明。
例如
#include <stdio.h>
int i = 10;
void fun2( void )
{
int i = 20;
printf("local i = %d\n",i);
{
extern int i;
printf( "global i = %d\n",i);
}
}
int main(void)
{
fun2();
}
程序输出为
local i = 20
global i = 10
最好的方法是给函数传参
void fun2(int fromExternalWorld){
int i=50;
printf("%d ",fromExternalWorld);
printf("%d\n",i);
}
int main(void)
{
fun2(i);
}
否则不可能在同一范围内显示两个具有相同名称的符号。
我在学校有这个作业,其中我必须找到以下 C 代码的输出,并且还要解释输出。
#include<stdio.h>
int i;
void fun1(void);
void fun2(void);
int main()
{
fun1();
fun2();
return 0;
}
void fun1(){
i=20;
printf("%d\t",i);
}
void fun2(){
int i=50;
printf("%d",i);
}
输出为 20 50 因为在 fun1() 中,全局变量 'i' 被分配给 20 并打印出来。在 fun2() 中,变量 'i' 是一个局部变量,它被声明并初始化为 50,然后被打印出来。
出于好奇,我有以下问题,如何在 fun2() 中使用全局变量 'i'? 一个简单的解决方案是简单地更改名称并避免整个事情。但我的好奇心是由于Java,其中有一个关键字“this”来访问class变量而不是局部变量。
那么在 C 中有什么方法可以做到这一点吗?
无法访问具有同名局部变量的函数内的全局参数。虽然如您所见,在 C 中创建此类局部变量通常是一种不好的做法,但并不禁止。 在 C++ 中,您可以使用名称空间解决它,但在 C 中没有等效项。
您可以在声明局部 i
之前欺骗并创建指向全局 i
的指针:
void fun2( void )
{
int *ip = &i; // get address of global i
int i = 50; // local i ”shadows" global i
printf( "local i = %d, global i = %d\n", i, *ip );
}
编辑
看到这个答案被接受了,我必须强调你应该永远不要写这样的代码。这是一个 band-aid 糟糕的编程实践。
尽可能避免使用全局变量,在不可能的地方使用 明确 将它们标记为全局变量且不太可能被隐藏的命名约定(例如使用前缀 g_
或类似的东西)。
我无法告诉你我浪费了多少时间来追查由于这样的命名冲突引起的问题。
唯一的办法是在代码块中隐藏局部变量的声明。
例如
#include <stdio.h>
int i = 10;
void fun2( void )
{
int i = 20;
printf("local i = %d\n",i);
{
extern int i;
printf( "global i = %d\n",i);
}
}
int main(void)
{
fun2();
}
程序输出为
local i = 20
global i = 10
最好的方法是给函数传参
void fun2(int fromExternalWorld){
int i=50;
printf("%d ",fromExternalWorld);
printf("%d\n",i);
}
int main(void)
{
fun2(i);
}
否则不可能在同一范围内显示两个具有相同名称的符号。