2010-11-21 9 views
17

Les variables globales sont-elles C static ou extern par défaut?
Si les variables globales sont par défaut statiques, cela signifie que nous serions en mesure d'y accéder dans un seul fichier, mais nous pouvons également utiliser des variables globales dans différents fichiers.
Cela implique-t-il qu'ils ont un stockage externe par défaut?variable globale dans C sont statiques ou non?

Répondre

30

Si vous ne spécifiez pas de classe de stockage (c'est-à-dire les mots-clés extern ou static), les variables globales ont par défaut une liaison externe. De la norme C99:

§6.2.2 liens d'identificateurs

3) Si la déclaration d'un identificateur d'étendue de fichier pour un objet ou une fonction contient le spécificateur de classe de stockage static, l'identificateur a une liaison interne.

5) Si la déclaration d'un identificateur pour une fonction n'a pas de spécificateur de classe de stockage, sa liaison est déterminée exactement comme si elle avait été déclarée avec le spécificateur de classe de stockage extern. Si la déclaration d'un identificateur pour un objet a une portée de fichier et pas de spécificateur de classe de stockage, sa liaison est externe.

Donc, même si vous ne spécifiez pas le mot-clé extern, GLOBALS peut encore être consulté par d'autres fichiers source (que l'on appelle unités de traduction), car ils peuvent avoir encore une déclaration extern pour la même variable. Si vous utilisez le mot-clé static pour spécifier le lien interne, alors même en présence d'une déclaration extern pour le même nom de variable dans un autre fichier source, il se référera à une variable différente.

+1

également pertinente : section 6.9.2, qui décrit les définitions provisoires; §4 de cette section montre explicitement comment plusieurs définitions de variables de fichier-scope interagissent – Christoph

+0

Thanx monsieur ........ Pouvez-vous s'il vous plaît expliquer ce qui est "static extern varx" ?? – Mishthi

+0

@Mishthi: Voulez-vous dire une variable à la fois statique et externe? J'ai peur que ce ne soit pas possible. –

6

En C, une variable globale qui ne dispose pas d'un initialiseur ou des spécificateurs de classe de stockage est une tentative de définition d'une variable avec durée de stockage statique et lien externe.

Dans une unité de traduction, toutes les définitions provisoires et jusqu'à une définition non provisoire (par exemple à partir d'une déclaration avec un initialiseur) sont regroupées en une seule définition pour une variable. Bien qu'il ne soit pas autorisé d'avoir une définition de la même variable dans plusieurs unités de traduction, il s'agit d'une extension commune pour autoriser des variables «communes», c'est-à-dire des définitions provisoires de la même variable dans plusieurs unités de traduction.

3

Les variables globales en C sont par défaut .. extern (ie) ils ont une liaison externe ..

Pour limiter le lien externe, spécificateur de classe de stockage « statique » peut être utilisé pour la variable globale .. si statique spécificateur est utilisé, la variable a la portée du fichier .. Vous ne pouvez pas lier dans un autre fichier en utilisant le mot-clé « extern » ..

Spécification « statique » dépend de votre utilisation du programme ..