Udostępnij za pośrednictwem


extern — specyfikator klasy magazynowania

Zmienna zadeklarowana z specyfikatorem klasy magazynu extern jest odwołaniem do zmiennej o tej samej nazwie, zdefiniowanej na poziomie zewnętrznym w dowolnym z plików źródłowych programu.Wewnętrzna deklaracja extern jest używana, aby uwidocznić w definicji zmiennej poziom zewnętrzny w bloku.O ile nie została zgłoszona na poziomie zewnętrznym, zmienna zadeklarowana ze słowem kluczowym extern jest widoczna tylko w bloku, w którym jest zadeklarowana.

Przykład

Ten przykład ilustruje wewnętrzny i zewnętrzny poziom deklaracji:

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

W tym przykładzie zmienna i jest zdefiniowana na poziomie zewnętrznym z wartością początkową 1.Deklaracja extern w funkcji main jest używana do zadeklarowania odwołania do zewnętrznego poziomu i.Zmienna statica jest zainicjowana na 0, ponieważ inicjator zostanie pominięty.Wywołanie printf służy do drukowania wartości 1, 0, 0 i 0.

W funkcji other, adres zmiennej globalnej i służy do inicjowania zmiennej wskaźnika staticexternal_i.To działa, ponieważ zmienna globalna ma okres istnienia static, co oznacza jego adres nie zmienia się podczas wykonywania programu.Następnie, zmienna i jest ponownie zdefiniowana jako wartość początkowa 16 zmiennej lokalnej.To ponowne zdefiniowanie nie wpływa na wartość poziomu zewnętrznego i, który jest ukryty przy użyciu jego nazwy zmiennej lokalnej.Wartość globalna i jest teraz dostępna tylko pośrednio w ramach tego bloku, poprzez wskaźnik external_i.Próba przypisania adresu zmiennej autoi na wskaźnik nie działa, ponieważ może być inna dla każdego wprowadzonego bloku.Zmienna a jest zadeklarowana jako zmienna static i zainicjowana na 2.To a nie powoduje konfliktu z a w main, ponieważ zmienne static na poziomie wewnętrznym są widoczne tylko w obrębie bloku, w którym są one zgłoszone.

Zmienna a jest zwiększana o 2, dając w wyniku 4.Jeśli funkcja other była nazywana ponownie w tym samym programie, początkowa wartość a jest 4.Wewnętrzne zmienne static zachowają wartości, gdy program kończy pracę, a następnie wraca do bloku, w którym są one zgłoszone.

Zobacz też

Koncepcje

Specyfikatory klasy magazynowania dla deklaracji na poziomie wewnętrznym