我如何访问C中的阴影全局variables?
我如何访问C中的阴影全局variables? 在C ++中,我可以使用::
作为全局命名空间。
如果你的文件范围variables不是静态的,那么你可以使用一个在嵌套范围内使用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; }
如果variables是用static声明的,我没有看到引用它的方法。
c中没有::但你可以使用getter函数
#include <stdio.h> int L=3; inline int getL() { return L; } int main(); { int L = 5; printf("%d, %d", L, getL()); }
如果您正在讨论全局variables的影子,那么可以使用dlsym()
来查找全局variables的地址,如下所示:
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); }
如果你想让你的代码看起来很性感,可以使用macros:
#define GLOBAL_ADDR(a,b) b =(typeof(b))dlsym(RTLD_NEXT, #a) ... int *pglob_myvar; GLOBAL_ADDR(myvar, pglob_myvar); ...
根据你在C中所称的屏蔽全局variables ,不同的答案是可能的。
如果您的意思是在另一个源文件或链接库中定义的全局variables,则只需使用extern
前缀重新声明它:
extern int aGlobalDefinedElsewhere;
如果你的意思是一个全局variables的阴影(或重叠,select你喜欢的术语)由相同名称的本地variables),没有内置的方式来做到这一点。所以你要么不这样做,要么解决它。 可能的解决scheme是
-
getter / setter函数访问全局variables(这是一个很好的习惯,特别是在multithreading情况下)
-
通过在局部variables之前定义的指针来将全局variablesreplace为全局variables:
int noName; { int * aliasToNoName = &noName; /* reference to global */ int noName; /* declaration of local */ *aliasToNoName = noName; /* assign local to global */ }
纯C中的“屏蔽全局variables”是什么?
在C你有本地variables,文件本地/全局variables(静态)和全局variables(外部)
so file1.c: int bla; file2.c extern int bla;
还有一个select就是在定义本地之前引用全局variables,或者至less先定义一个指向它的指针,以便在定义本地variables之后访问它。
#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想这么多只要使用指针variablesn存储全局variables的地址就可以在d main()中使用它。 即使在main()内部存在一个同名的局部variables,使用指针引用全局variables也不会成为问题。