Especificador de classe de armazenamento externa
Uma variável declarada com o especificador de classe de armazenamento extern é uma referência a uma variável com o mesmo nome definida no nível externo de qualquer um dos arquivos de origem do programa. A declaração interna de extern é usada para tornar a definição de variável de nível externo visível dentro do bloco. A menos que seja declarado de outra forma no nível externo, uma variável declarada com a palavra-chave extern é visível somente no bloco em que é declarada.
Exemplo
Este exemplo ilustra declarações de nível interno e externo:
// 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 );
}
Nesse exemplo, a variável i é definida no nível externo com o valor inicial 1. Uma declaração de extern na função main é usada para declarar uma referência à variável i de nível externo. A variável static a é inicializada como 0 por padrão, já que o inicializador é omitido. A chamada para printf imprime os valores 1, 0, 0 e 0.
Na função other, o endereço da variável global i é usado para inicializar a variável de ponteiro static external_i. Isso funciona porque a variável global tem tempo de vida static, ou seja, seu endereço não é alterado durante a execução do programa. Em seguida, a variável i é redefinida como uma variável local com valor inicial 16. Essa redefinição não afeta o valor da variável i de nível externo, que é ocultada pelo uso do respectivo nome para a variável local. O valor da i global agora é acessível apenas indiretamente dentro desse bloco, por meio do ponteiro external_i. A tentativa de atribuir o endereço da variável auto i a um ponteiro não funciona, pois ela pode ser diferente cada vez que se entra no bloco. A variável a é declarada como uma variável static e inicializada como 2. Essa variável a não entra em conflito com a variável a em main, pois as variáveis static no nível interno são visíveis apenas dentro do bloco em que são declaradas.
A variável a é aumentada em 2, dando 4 como resultado. Se a função other fosse chamada novamente no mesmo programa, o valor inicial de a seria 4. As variáveis static internas mantêm seus valores quando o programa sai do bloco em que elas são declaradas e depois torna a entrar nele.
Consulte também
Conceitos
Especificadores de classe de armazenamento para declarações de nível interno