Freigeben über


extern-Speicherklassenspezifizierer

Eine Variable, die mit dem extern Speicherklassenspezifizierer deklariert wird, ist ein Verweis auf eine Variable mit demselben Namen, der auf der externen Ebene in einem der Quelldateien des Programms definiert ist.Die interne extern Deklaration wird verwendet, um die externe Ebene Variablendefinition innerhalb des Blocks sichtbar zu machen.Sofern andernfalls auf der externen Ebene deklariert ist eine Variable, die mit dem extern-Schlüsselwort deklarierte nur im Block, in dem sie deklariert ist.

Beispiel

Dieses Beispiel veranschaulicht die interne und die externe Ebene Deklarationen:

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

In diesem Beispiel trägt die Variable i auf der externen Ebene mit Anfangswert 1 definiert.Eine extern Deklaration in der main-Funktion wird verwendet, um einen Verweis auf die externe Ebene izu deklarieren.Die statische Variable wird mit 0 initialisiert a standardmäßig als Initialisierer weggelassen wird.Der Aufruf von printf gibt die Werte 1, 0, 0 und 0.

In der other-Funktion wird die Adresse der globalen Variablen i verwendet, um die static Zeigervariable external_izu initialisieren.Dies funktioniert, da die globale Variable static Lebensdauer verfügt. Dies bedeutet, dass seine Adresse nicht während der Programmausführung ändern.Danach wird die Variable i als lokale Variable mit dem Anfangswert 16 neu definiert.Diese Neudefinition wirkt sich nicht auf den Wert der externen iEbene, die unter Verwendung von seinem Namen für die lokale Variable ausgeblendet ist.Der Wert globalen i ist jetzt nur innerhalb dieses Blocks indirekt durch den Zeiger external_izugegriffen werden.Der Versuch, auf die Adresse auto-Variable zuzuweisen i in einen Zeiger ist nicht möglich, da es sich bei jedem der Block eingegeben wird, unterscheidet.Die Variable a wird als statische Variable deklariert und initialisiert bis 2.Dieses a nicht in Konflikt mit amain, da statische Variablen auf der internen Ebene nur innerhalb des Blocks sichtbar sind, in dem sie deklariert werden.

Die Variable a wird um 2 erhöht und gibt das Ergebnis als 4.Wenn die other-Funktion im selben Programm erneut aufgerufen wurden, wird der Anfangswert von a 4 sein.Interne statische Variablen beibehalten, wenn die ihre Werte und geben Sie dann Beenden des Programms den Block, in dem sie deklariert werden.

Siehe auch

Konzepte

Speicherklassenspezifizierer für Intern-Ebene Deklarationen