views:

817

answers:

6

How can I access a shadowed global variable in C? In C++ I can use :: for the global namespace.

+5  A: 

What do you mean by "shielded"? If you mean a variable that has been shadowed in the scope, I don't think there's a way to go around that. C does not have a namespace resolution operator, since it also does not have namespaces.

int foo;
{
  int foo;
  /* Here, we can't reach the outer 'foo', it is shadowed. */
}
unwind
+1  A: 

what is a "shielded global variable" in pure C?

in C you have local variables, file local/global variables (static) and global variables (extern)

so file1.c:
int bla;

file2.c
extern int bla;
Peter Miehle
+10  A: 

There is no :: in c but you can use a getter function

#include <stdio.h>

int L=3;

inline int getL()
{
   return L;
}

int main();
{
   int L = 5;

   printf("%d, %d", L, getL());
}
Dutow
+1  A: 

Depending on what you call shielded global variable in C, different answers are possible.

If you mean a global variable defined in another source file or a linked library, you only have to declare it again with the extern prefix:

extern int aGlobalDefinedElsewhere;

If you mean a global variable shadowed (or eclipsed, choose the terminology you prefer) by a local variable of the same name), there is no builtin way to do this in C. So you have either not to do it or to work around it. Possible solutions are:

  • getter/setter functions for accessing global variable (which is a good practice, in particular in multithreaded situations)

  • aliases to globals by way of a pointer defined before the local variable:

    int noName;
    {
        int * aliasToNoName = &noName; /* reference to global */
        int noName;                    /* declaration of local */
        *aliasToNoName = noName;       /* assign local to global */
    }
    
mouviciel
+3  A: 

If you are talking about shadowed global var, then (on Linux) you can use dlsym() to find an address of the global variable, like this:

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);
}

If you want your code to look sexy, use macro:

#define GLOBAL_ADDR(a,b)  b =(typeof(b))dlsym(RTLD_NEXT, #a)
...
int *pglob_myvar;
GLOBAL_ADDR(myvar, pglob_myvar);
...
qrdl
+8  A: 

If your file-scope variable is not static, then you can use a declaration that uses extern in a nested scope:

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;
}

If the variable is declared with static, i don't see a way to refer to it.

Johannes Schaub - litb
*THANKS*\\wbr Vitaly
vitaly.v.ch