如何在C中访问带阴影的全局变量?

时间:2009-03-06 12:54:34

标签: c scope global-variables

如何在C中访问带阴影的全局变量?在C ++中,我可以将::用于全局命名空间。

7 个答案:

答案 0 :(得分:41)

如果您的文件范围变量不是静态的,那么您可以使用在嵌套范围内使用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声明变量,我看不到引用它的方法。

答案 1 :(得分:21)

c中没有::但你可以使用getter函数

#include <stdio.h>

int L=3;

inline int getL()
{
   return L;
}

int main();
{
   int L = 5;

   printf("%d, %d", L, getL());
}

答案 2 :(得分:4)

如果您正在讨论阴影全局变量,那么(在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);
...

答案 3 :(得分:2)

根据您在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 */
    }
    

答案 4 :(得分:1)

纯C中的“屏蔽全局变量”是什么?

在C中你有局部变量,文件局部/全局变量(静态)和全局变量(外部)

so file1.c:
int bla;

file2.c
extern int bla;

答案 5 :(得分:0)

另一种选择是在定义本地之前引用全局,或者至少首先获取指向它的指针,以便在定义本地之后访问它。

#include <stdio.h>

int x = 1234;
int main()
{
   printf("%d\n",x); // prints global
   int x = 456;
   printf("%d\n",x); // prints local
}

答案 6 :(得分:-1)

gyz y 2这么想 只需使用指针变量n存储全局变量的地址就可以在d main()中使用它。即使在main()中有一个同名的局部变量,使用指针引用全局变量也不会有问题。