Compartilhar via


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