Acesse uma variável estática global de outro arquivo em C
-
21-09-2019 - |
Pergunta
No idioma C, quero acessar uma variável estática global fora do escopo do arquivo. Deixe -me saber a melhor maneira possível de fazer isso. Um dos métodos é atribuir uma variável global externa o valor da variável estática,
No arquivo AC
static int val = 10;
globalvar = val;
No arquivo bc
extern globalvar;
Mas, nesse caso, qualquer alteração no VAL (FILE AC) não será atualizada no GlobalVar in (FILE BC).
Por favor, deixe -me saber como posso conseguir o mesmo.
Obrigado, Sikandar.
Solução
Bem, se você pode modificar o arquivo a.c
Então basta fazer val
não estático.
Se você pode modificar a.c
mas não posso fazer val
Não estático (por quê?), Então você pode simplesmente declarar um ponteiro global para ele em a.c
int *pval = &val;
e em b.c
Faz
extern int *pval;
que permitirá que você acesse o valor atual de val
Através dos *pval
. Ou você pode apresentar uma função não estática que retornará o valor atual de val
.
Mas, novamente, se você precisar acessá-lo de outras unidades de tradução, apenas torne-o não estático.
Outras dicas
Você pode fazer o ponteiro variável global para a variável estática global.
/* file a.c */
static int a = 100; /* global static variable not visible outside this file.*/
int *b = &a; /* global int pointer, pointing to global static*/
/* file b.c */
extern int *b; /* only declaration, b is defined in other file.*/
int main()
{
printf("%d\n",*b); /* dereferencing b will give the value of variable a in file a.c */
return 0;
}
Na corrida:
$ gcc *.c && ./a.out
100
Você não pode acessar uma variável estática no nível do arquivo fora do arquivo.
Se você realmente precisa fazer isso, você tem algumas opções.
Adicione uma função de acessador ao arquivo que possui a variável estática. O bom é que isso restringe o acesso de fora do arquivo ao acesso somente leitura:
int read_static () {return val; }
Abaixe o qualificador estático e faça da variável uma global.
Solução 1:
No arquivo AC
static int val=10;
int *globalvar =&val;
No arquivo bc
extern int *globalvar;
Solução 2:
Em vez de ter outra variável para passar no endereço da variável estática, adicionando assim poucos desperdícios de bytes de memória, torne a variável estática como externa.
A solução 2 é recomendada, mas, caso você esteja restrito a alterar a variável estática para extern, use a solução 1.