题
如何在 C 中访问隐藏的全局变量?在 C++ 中我可以使用 ::
对于全局命名空间。
解决方案
如果您的文件范围变量不是静态的,那么您可以使用在嵌套范围内使用extern的声明:
int c;
int main() {
{
int c = 0;
// now, c shadows ::c. just re-declare ::c in a
// nested scope:
{
extern int c;
c = 1;
}
// outputs 0
printf("%d\n", c);
}
// outputs 1
printf("%d\n", c);
return 0;
}
如果使用static声明变量,我看不到引用它的方法。
其他提示
c中没有::但你可以使用getter函数
#include <stdio.h>
int L=3;
inline int getL()
{
return L;
}
int main();
{
int L = 5;
printf("%d, %d", L, getL());
}
如果你在讨论shadowed global var,那么(在Linux上)你可以使用 dlsym()
来查找全局变量的地址,如下所示:
int myvar = 5; // global
{
int myvar = 6; // local var shadows global
int *pglob_myvar = (int *)dlsym(RTLD_NEXT, "myvar");
printf("Local: %d, global: %d\n", myvar, *pglob_myvar);
}
如果您希望代码看起来很性感,请使用宏:
#define GLOBAL_ADDR(a,b) b =(typeof(b))dlsym(RTLD_NEXT, #a)
...
int *pglob_myvar;
GLOBAL_ADDR(myvar, pglob_myvar);
...
取决于你叫什么 C 中的屏蔽全局变量, ,可能有不同的答案。
如果您指的是在另一个源文件或链接库中定义的全局变量,则只需使用 extern
字首:
extern int aGlobalDefinedElsewhere;
如果您的意思是全局变量被同名的局部变量遮蔽(或遮蔽,选择您喜欢的术语),则在 C 中没有内置方法可以执行此操作。所以你要么不做,要么想办法解决。可能的解决方案是:
用于访问全局变量的 getter/setter 函数(这是一个很好的实践,特别是在多线程情况下)
通过在局部变量之前定义的指针为全局变量设置别名:
int noName; { int * aliasToNoName = &noName; /* reference to global */ int noName; /* declaration of local */ *aliasToNoName = noName; /* assign local to global */ }
什么是“屏蔽全局变量”?在纯C?
在C中你有局部变量,文件局部/全局变量(静态)和全局变量(外部)
so file1.c:
int bla;
file2.c
extern int bla;
另一种选择是在定义本地之前引用全局,或者至少首先获取指向它的指针,以便在定义本地之后访问它。
#include <stdio.h>
int x = 1234;
int main()
{
printf("%d\n",x); // prints global
int x = 456;
printf("%d\n",x); // prints local
}
gyz y 2这么想 只需使用指针变量n存储全局变量的地址就可以在d main()中使用它。即使在main()中有一个同名的局部变量,使用指针引用全局变量也不会有问题。
不隶属于 StackOverflow