Como posso acessar uma variável global sombreada em C?
-
03-07-2019 - |
Pergunta
Como posso acessar uma variável global sombreada em C? Em C ++ eu posso usar ::
para o namespace global.
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 ().