Sdílet prostřednictvím


extern – specifikátor třídy úložiště

Proměnná deklarovaná pomocí specifikátoru paměťové třídy extern je odkaz na proměnnou s stejným názvem, která je definovaná na vnější úrovni v jakémkoli zdrojovém souboru programu.Pomocí vnitřní deklarace extern lze definice proměnné na vnější úrovni zviditelnit v rámci bloku.Není-li na vnější úrovni deklarováno jinak, je proměnná deklarovaná pomocí klíčového slova extern viditelná pouze v bloku, ve kterém je deklarována.

Příklad

Tento příklad ilustruje deklarace na vnitřní a vnější úrovni:

// 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 );
}

V tomto příkladu je proměnná i definována na vnější úrovni s počáteční hodnotou 1.Deklarace extern ve funkci main umožňuje deklarovat odkaz na proměnnou i na vnější úrovni.Statická proměnná a je ve výchozím nastavení inicializována na 0, protože je inicializátor vynechán.Volání funkce printf vytiskne hodnoty 1, 0, 0 a 0.

Ve funkci other adresa globální proměnné i slouží k inicializaci statické proměnné ukazatele external_i.Tento postup funguje, protože globální proměnná má statickou životnost, což znamená, že se její adresa během provádění programu nezmění.Dále je proměnná i redefinována jako místní proměnná s počáteční hodnotou 16.Tato redefinice nemá vliv na hodnotu proměnné i na externí úrovni, která je pomocí jejího názvu jako lokální proměnné skryta.Hodnota globální proměnné i je nyní v rámci tohoto bloku přístupná pouze nepřímo pomocí ukazatele external_i.Pokus o přiřazení adresy proměnné i deklarované jako auto do ukazatele nefunguje, protože může být odlišná pokaždé, když je blok proveden.Proměnná a je deklarována jako statická proměnná a inicializována na hodnotu 2.Tato proměnná a není v rozporu s proměnnou a ve funkci main, protože statické proměnné na vnitřní úrovni jsou viditelné pouze v rámci bloku, ve kterém jsou deklarovány.

Proměnná a je zvýšena o 2 a výsledek je 4.Pokud by byla funkce other volána znovu ve stejném programu, počáteční hodnota proměnné a by byla 4.Vnitřní statické proměnné při ukončení programu zachovají své hodnoty a poté znovu vstoupí do bloku, ve kterém jsou deklarovány.

Viz také

Koncepty

Specifikátory třídy úložiště pro deklarace na interní úrovni