簡體   English   中英

如何訪問 C 中的陰影全局變量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM