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 em outro arquivo de origem. Ela é usada para tornar visível a definição da variável de nível externo. Uma variável declarada como extern não tem nenhum armazenamento alocado para si mesma; ela é apenas um nome.

Exemplo

Este exemplo ilustra declarações de nível interno e externo:


// Source1.c

int i = 1;

// Source2. c

#include <stdio.h>

// Refers to the i that is defined in Source1.c:
extern int i;

void func(void);

int main()
{
    // Prints 1:
    printf_s("%d\n", i);
    func();
    return;
}

void func(void)
{
    // Address of global i assigned to pointer variable:
    static int *external_i = &i;

    // This definition of i hides the global i in Source.c:
    int i = 16;

    // Prints 16, 1:
    printf_s("%d\n%d\n", i, *external_i);
}

Neste exemplo, a variável i é definida em Source1.c com um valor inicial de 1. Uma declaração extern em Source2.c torna o 'i' visível nesse arquivo.

Na função func, o endereço da variável global i é usado para inicializar a variável de ponteiro staticexternal_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, uma variável i é definida dentro do escopo de func como uma variável local com o valor inicial 16. Essa definiçã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 de i global agora está acessível apenas através do ponteiro external_i.

Confira também

Especificadores de classe de armazenamento para declarações de nível interno