Identificatore di classi di archiviazione externextern Storage-Class Specifier

Una variabile dichiarata con l'identificatore di classe di archiviazione extern è un riferimento a una variabile con lo stesso nome, definita a livello esterno in un qualsiasi file di origine del programma.A variable declared with the extern storage-class specifier is a reference to a variable with the same name defined at the external level in any of the source files of the program. La dichiarazione interna extern viene utilizzata per rendere la definizione della variabile a livello esterno visibile all'interno del blocco.The internal extern declaration is used to make the external-level variable definition visible within the block. Salvo diversamente dichiarato a livello esterno, una variabile dichiarata con la parola chiave extern è visibile solo nel blocco in cui è dichiarata.Unless otherwise declared at the external level, a variable declared with the extern keyword is visible only in the block in which it is declared.

EsempioExample

In questo esempio sono illustrate le dichiarazioni a livello interno e a livello esterno:This example illustrates internal- and external-level declarations:

// 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 questo esempio la variabile i è definita a livello esterno con un valore iniziale 1.In this example, the variable i is defined at the external level with initial value 1. Una dichiarazione extern nella funzione main viene utilizzata per dichiarare un riferimento al livello esterno i.An extern declaration in the main function is used to declare a reference to the external-level i. La variabile static a viene inizializzata a 0 per impostazione predefinita perché l'inizializzatore viene omesso.The static variable a is initialized to 0 by default, since the initializer is omitted. La chiamata a printf consente di stampare i valori 1, 0, 0 e 0.The call to printf prints the values 1, 0, 0, and 0.

Nella funzione other l'indirizzo della variabile globale i viene usato per inizializzare la variabile puntatore static external_i.In the other function, the address of the global variable i is used to initialize the static pointer variable external_i. Questa operazione è possibile perché la variabile globale ha una durata static, pertanto il relativo indirizzo rimane invariato durante l'esecuzione del programma.This works because the global variable has static lifetime, meaning its address does not change during program execution. Successivamente, la variabile i viene ridefinita come variabile locale con valore iniziale 16.Next, the variable i is redefined as a local variable with initial value 16. Questa ridefinizione non influisce sul valore di i a livello dell'esterno, il quale viene nascosto mediante l'utilizzo di un nome per la variabile locale.This redefinition does not affect the value of the external-level i, which is hidden by the use of its name for the local variable. Il valore della variabile globale i è accessibile solo indirettamente all'interno di questo blocco, mediante il puntatore external_i.The value of the global i is now accessible only indirectly within this block, through the pointer external_i. Il tentativo di assegnare l'indirizzo della variabile auto i a un puntatore non funziona, poiché potrebbe essere diverso ogni volta in cui viene eseguito l'accesso al blocco.Attempting to assign the address of the auto variable i to a pointer does not work, since it may be different each time the block is entered. La variabile a viene dichiarata come variabile static e inizializzata a 2.The variable a is declared as a static variable and initialized to 2. Questo elemento a non è in conflitto con a in main, poiché le variabili static a livello interno sono visibili solo all'interno del blocco in cui sono dichiarate.This a does not conflict with the a in main, since static variables at the internal level are visible only within the block in which they are declared.

La variabile a è maggiore di 2 e restituisce 4 come risultato.The variable a is increased by 2, giving 4 as the result. Se la funzione other venisse chiamata nuovamente nello stesso programma, il valore iniziale a sarebbe 4.If the other function were called again in the same program, the initial value of a would be 4. Le variabili interne static mantengono i valori al termine del programma e quindi riaccedono al blocco in cui sono dichiarate.Internal static variables keep their values when the program exits and then reenters the block in which they are declared.

Vedere ancheSee Also

Identificatori di classi di archiviazione per dichiarazioni di livello internoStorage-Class Specifiers for Internal-Level Declarations