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.

Foi útil?

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.

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

  2. 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.

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