extern spécificateur de classe de stockage
Une variable déclarée avec le spécificateur de classe de stockage d' extern est une référence à une variable avec le même nom défini au niveau externe dans les fichiers sources de l'ordinateur virtuel du programme.La déclaration interne d' extern est utilisée pour rendre l'externe-niveau la définition de variable visible dans le bloc.À moins qu'sinon déclaré au niveau externe, une variable déclarée avec le mot clé d' extern est visible uniquement dans le bloc dans lequel il est déclaré.
Exemple
cet exemple montre des déclarations interne- et d'externe-niveau :
// 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 );
}
dans cet exemple, i variable est défini au niveau externe avec la valeur 1 initiale.Une déclaration d' extern dans la fonction d' main permet de déclarer une référence à l'externe-niveau i.statiquea variable est initialisé à 0 par défaut, puisque l'initialiseur est omis.l'appel à printf imprime les valeurs 1, 0, 0, et 0.
dans la fonction d' other , l'adresse de la variable globale i est utilisée pour initialiser la variable pointeur external_ide statique .Cela fonctionne parce que la variable globale a la durée de vie de statique , ce qui signifie que son adresse ne change pas pendant l'exécution du programme.Ensuite, la variable i est redéfinie comme variable locale de la valeur initiale 16.Cette redéfinition n'affecte pas la valeur de l'externe-niveau i, qui est masqué par l'utilisation son nom de la variable locale.La valeur d' i global est désormais accessible uniquement indirectement dans ce bloc, via le pointeur external_i.Essayer d'assigner l'adresse d' autoi variable à un pointeur ne fonctionne pas, parce qu'il peut être différent à chaque fois le bloc est entrée.La variable a est déclarée comme une variable de statique et initialisé à 2.Cet a n'est pas en conflit avec a dans main, étant donné que les variables de statique au niveau interne sont visibles uniquement dans le bloc dans lequel ils sont déclarés.
La variable a est augmenté par 2, ce qui donne 4 comme résultat.Si la fonction d' other était de nouveau appelée dans le même programme, la valeur initiale d' a serait 4.Les variables internes de statique conservent leurs valeurs lorsque le programme se ferme puis réentrent le bloc dans lequel ils sont déclarés.
Voir aussi
Concepts
Spécificateur de classe de stockage pour les déclarations d'Interne- Niveau