0

Dans les énoncés suivants trois premiers sont les définitions et la dernière est la déclaration:déclarations variables et types de données

auto int i; 

static int j; 

register int k; 

extern int l; 

Quelle est la raison de la même chose?

+1

Le dernier indique au compilateur que 'int l' est défini quelque part ailleurs, et l'éditeur de liens le trouvera. –

+0

La question est réellement de savoir quelle est la différence entre * definition * et * declaration *? –

+0

@FelixPalmen yes –

Répondre

1

Dans les trois premiers (int i, statique int j, registre int k) est une définition. Il indique l'espace pour que l'entier soit dans cette unité de traduction et conseille au lieur de lier toutes les références à i par rapport à cette entité. Si vous avez plus ou moins exactement l'une de ces définitions, l'éditeur de liens se plaindra.

Mais en dernier extern int l, est une déclaration, puisqu'elle introduit/spécifie simplement l, aucune nouvelle adresse/espace mémoire n'est allouée. Vous pouvez avoir autant d'int ext dans chaque unité de compilation que vous le souhaitez. Une déclaration introduit les noms dans une unité de traduction ou redéclare les noms introduits par les déclarations précédentes.

+0

Exactement une fois ... il est tout à fait légal de définir deux fois une variable (n non initialisée) à l'échelle globale, par exemple 'int i; int i; ' –

+0

En C, int i; dans la portée du fichier (en dehors de toute fonction) est une déclaration et une définition provisoire. Plusieurs définitions provisoires sont autorisées. une seule définition est autorisée. –

1

Je suppose que la question porte sur les termes déclaration et définition en C.

  • Une déclaration indique le nom du compilateur et le type de "quelque chose".

  • Une définition est une déclaration, mais en plus « crée » la « quelque chose » qui est déclaré. Par exemple. pour une variable, cela introduirait de l'espace de stockage pour cette variable.

Dans vos trois premiers exemples, les variables sont réellement créées. Les classes de stockage auto, static et register spécifient toutes simplement une durée de stockage. En revanche, la classe de stockage extern indique au compilateur que cette variable est connue, mais elle peut exister dans une autre unité de traduction .

Peut-être un exemple comparant la déclaration et définition des fonctions va rendre le concept plus facile à comprendre:

// function declaration: 
int foo(int x); 
// (now we know a function foo should be "somewhere", but it doesn't exist yet) 

// function definition: 
int foo(int x) { 
    return x+1; 
}