[英]How can I access a shadowed global variable in C?
如何訪問 C 中的陰影全局變量? 在 C++ 中,我可以使用::
作為全局命名空間。
如果您的文件范圍變量不是 static,那么您可以在嵌套的 scope 中使用使用 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 中沒有:: 但您可以使用吸氣劑 function
#include <stdio.h>
int L=3;
inline int getL()
{
return L;
}
int main();
{
int L = 5;
printf("%d, %d", L, getL());
}
如果您正在談論影子全局變量,那么(在 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 將全局變量的地址存儲在其中 n den 在 d main() 中使用它。 即使 main() 中存在同名的局部變量,使用指針來引用全局變量也不會有問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.