Especificador de classe de armazenamento extern
Uma variável declarada com o extern o especificador de classe de armazenamento é uma referência a uma variável com o mesmo nome definido no nível externo em qualquer um dos arquivos de origem do programa.O interno extern declaração é usada para fazer com que a definição de variável de nível externo visível dentro do bloco.A menos que outra forma declarada no nível externo, uma variável declarada com o extern palavra-chave é visível apenas no bloco no qual ele está declarado.
Exemplo
Este exemplo ilustra as declarações interno e externo-nível:
// extern_StorageClassSpecified.c
#include <stdio.h>
void other( void );
int main()
{
// Reference to i, defined below:
extern int i;
// Initial value is zero; a is visible only within main:
static int a;
// b is stored in a register, if possible:
register int b = 0;
// Default storage class is auto:
int c = 0;
// Values printed are 1, 0, 0, 0:
printf_s( "%d\n%d\n%d\n%d\n", i, a, b, c );
other();
return;
}
int i = 1;
void other( void )
{
// Address of global i assigned to pointer variable:
static int *external_i = &i;
// i is redefined; global i no longer visible:
int i = 16;
// This a is visible only within the other function:
static int a = 2;
a += 2;
// Values printed are 16, 4, and 1:
printf_s( "%d\n%d\n%d\n", i, a, *external_i );
}
Neste exemplo, a variável i é definida no nível externo com o valor inicial 1.Um extern declaration in a main função é usada para declarar uma referência para o nível externo i.O estático variável a inicializadas como 0 por padrão, uma vez que o inicializador for omitido.A chamada para printf imprime os valores 0, 0, 0 e 1.
No other função, o endereço da variável global i é usado para inicializar o estático variável de ponteiro external_i.Isso funciona porque a variável global tem estático ciclo de vida, o que significa que o seu endereço não muda durante a execução do programa.Em seguida, a variável i será redefinido como uma variável local com o valor inicial 16.Essa redefinição não afeta o valor do nível de external i, que está oculto pelo uso de seu nome para a variável local.O valor do modelo global da i agora está acessível apenas indiretamente dentro desse bloco, através do ponteiro external_i.Tentativa de atribuir o endereço da auto variável i para um ponteiro não funcionar, desde que ele pode ser diferente cada vez que o bloco é inserido.A variável a é declarada como uma estático variável e inicializados para 2.Isso a não está em conflito com o a na main, desde que estático variáveis no nível interno são visíveis somente dentro do bloco no qual elas são declaradas.
A variável a é aumentada por 2, dando 4 como resultado.Se a other a função foi chamada novamente no mesmo programa, o valor inicial do a seria 4.Interno estático variáveis mantêm seus valores, quando o programa é encerrado e, em seguida, reiniciará o bloco em que elas são declaradas.
Consulte também
Conceitos
Especificadores de classe de armazenamento para declarações em nível interno