Pergunta

Como posso acessar uma variável global sombreada em C? Em C ++ eu posso usar :: para o namespace global.

Foi útil?

Solução

Se a sua variável de arquivo-escopo não é estático, então você pode usar uma declaração de que usos externa em um escopo aninhado:

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

Se a variável é declarada com estática, eu não vejo uma maneira de se referir a ele.

Outras dicas

Não há :: no c mas você pode usar uma função getter

#include <stdio.h>

int L=3;

inline int getL()
{
   return L;
}

int main();
{
   int L = 5;

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

Se você está falando sobre var mundial sombreado, então (no Linux) você pode usar dlsym() para encontrar um endereço da variável global, como este:

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

Se você quiser que o seu código para olhar sexy, use macro:

#define GLOBAL_ADDR(a,b)  b =(typeof(b))dlsym(RTLD_NEXT, #a)
...
int *pglob_myvar;
GLOBAL_ADDR(myvar, pglob_myvar);
...

Dependendo do que você chama blindado variável global em C , diferentes respostas são possíveis.

Se você quer dizer uma variável global definida em outro arquivo de origem ou uma biblioteca ligada, você só tem que declará-la novamente com o prefixo extern:

extern int aGlobalDefinedElsewhere;

Se você quer dizer uma variável global sombreada (ou eclipsada, escolha a terminologia que você preferir) por uma variável local com o mesmo nome), não há nenhuma maneira builtin fazer isso em C. Então você tem tanto para não fazê-lo ou para contornar isso. soluções possíveis são:

  • apanhador / definidor funções de acesso variável global (que é uma boa prática, em especial em situações de vários segmentos)

  • aliases para globals por meio de um ponteiro definido antes da variável local:

    int noName;
    {
        int * aliasToNoName = &noName; /* reference to global */
        int noName;                    /* declaration of local */
        *aliasToNoName = noName;       /* assign local to global */
    }
    

O que é um "blindado variável global" em C puro?

em C você tem variáveis ??locais, variáveis ??de arquivo local / global (estáticos) e variáveis ??globais (externa)

so file1.c:
int bla;

file2.c
extern int bla;

No entanto, outra opção é para fazer referência ao mundial antes de definir o seu local, ou pelo menos obter um ponteiro para ele primeiro para que você possa acessá-lo após a definição de seu local.

#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 pensar tanto Basta usar variável ponteiro n armazenar o endereço da variável global em que n den usá-lo dentro d main (). usando o ponteiro para referir-se a variável global não será um problema, mesmo se uma variável local com o mesmo nome está lá dentro main ().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top