Udostępnij za pośrednictwem


Specyfikator klasy magazynowej extern

Zmienna zadeklarowana z extern Specyfikator klasy magazynowania jest odwołanie do zmiennej o tej samej nazwie, zdefiniowane na poziomie zewnętrznych w żadnym z plików źródłowych z programu.Wewnętrzna extern deklaracji jest używany do utworzenia definicji zmiennych zewnętrznych poziom widoczne w bloku.O ile nie ustalono inaczej zadeklarowana na poziomie zewnętrznych, Zmienna zadeklarowana z extern słowo kluczowe jest widoczne tylko w bloku, w którym jest on zadeklarowany.

Przykład

Ten przykład ilustruje wewnętrznych i zewnętrznych poziomu - deklaracje:

// 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 zdefiniowany na poziomie zewnętrznych, z początkowa wartość 1.extern Deklaracji w main funkcja jest używana do zadeklarować odniesienie do poziomu zewnętrznych i.Statyczne zmienna a jest inicjowany na 0 domyślnie, ponieważ pominięto inicjatora.Wywołanie printf służy do drukowania wartości 1, 0, 0 i 0.

W other funkcja, adres zmiennej globalnej i służy do inicjowania statyczne wskaźnik zmiennej external_i.To działa, ponieważ ma zmienną globalną statyczne okres istnienia, co oznacza jej adres nie zmienia się podczas wykonywania programu.Dalej, zmienna i przedefiniować tak, jak zmienna lokalna o wartości początkowej 16.Ten dokonanym nie wpływa na wartość poziomu zewnętrznych i, która jest ukryta przy użyciu jego nazwy zmiennej lokalnej.Wartość globalnym i jest teraz dostępny tylko pośrednio w ramach tego bloku, poprzez wskaźnik external_i.Próby przypisania na adres auto zmienna i na wskaźnik nie działa, ponieważ może być inna każdym bloku jest wprowadzana.Zmienna a jest zadeklarowana jako statyczne zmienną i zainicjować 2.To a nie powoduje konfliktu z a w main, ponieważ statyczne zmienne na poziomie wewnętrznego są widoczne tylko w obrębie bloku, w którym są one zgłoszone.

Zmienna a zwiększa się o 2, podając 4 w wyniku.Jeśli other funkcji były nazywane ponownie w tym samym programie, wartość początkowa a byłoby 4.Wewnętrzny statyczne zmienne przechowują ich wartości, gdy program kończy działanie, a następnie reenters blok, w którym są one zgłoszone.

Zobacz też

Koncepcje

Specyfikatory klasy magazynu dla deklaracji wewnętrznego poziomu