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

Posted

技术标签:

【中文标题】如何访问 C 中的阴影全局变量?【英文标题】:How can I access a shadowed global variable in C? 【发布时间】:2010-10-11 18:02:10 【问题描述】:

在 C++ 中,我可以使用 :: 作为全局命名空间。

【问题讨论】:

解决方案是避免阴影变量...不可避免地会搞砸你...(我从经验中说) 【参考方案1】:

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

#include <stdio.h>

int x = 1234;
int main()

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

【讨论】:

【参考方案2】:

如果您的文件范围变量不是静态的,那么您可以使用在嵌套范围内使用 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;

如果变量是用静态声明的,我看不到引用它的方法。

【讨论】:

如果是静态的,在与c相同的范围内添加另一个静态变量static int *address_of_c=&amp;c;,然后使用*address_of_c访问它。 @R.. 我理解这是访问“::c”而不向全局范围添加内容的挑战。 如果变量是静态文件(例如第一行是static int c = 42;),那么最里面的块中的extern表示“在当前函数之外定义的变量c , 并引用文件范围变量。或者,至少,GCC 4.8.2 是这样解释它的。 @JohannesSchaub-litb C 没有::?根据this answer,在 C 中无法访问阴影变量。 @iam 我不确定你在说什么。另一个答案是否正确取决于他所说的“参考标识符”是什么意思。在我的回答中,我再次声明“c”并使用该本地块作用域标识符来引用在文件作用域中声明的对象。也许他/她不知道我的“技巧”,或者他只是将我的技巧视为不引用文件范围标识符。我的代码中的引用是通过链接完成的,而不是通过查找完成的。你最好直接问他/她的意思【参考方案3】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

#include <stdio.h>

int L=3;

inline int getL()

   return L;


int main();

   int L = 5;

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

【讨论】:

【参考方案6】:

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

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

so file1.c:
int bla;

file2.c
extern int bla;

【讨论】:

以上是关于如何访问 C 中的阴影全局变量?的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 访问 C 全局变量 'errno'

从 C 中的另一个文件访问全局静态变量

vue2.0 全局变量怎么设置

如何通过 Python 和 ctype 访问 C 全局变量结构

全局变量比C中的局部变量快吗? [关闭]

全局变量怎么定义