2010-07-27 6 views
2

toujours confondue avec la déclaration et la définition en terme de C: si un fichier d'en-tête est comme:déclaration et définition

#ifndef _BASIC_H_ 
#define _BASIC_H_ 

void test(); 
extern int i; //define or declare 
#endif 

et deux fichiers sources f1.c et f2.c contiennent cet en-tête, puis une source fichier besoin de définir la variable "i".

mais si le fichier d'en-tête est comme:

#ifndef _BASIC_H_ 
#define _BASIC_H_ 

void test(); 
int i; //define or declare 
#endif 

et deux fichiers source f1.c et f2.c, contiennent cet en-tête sans définir la variable « i » dans un fichier, il va encore à travers quand J'utilise la variable.
mes questions est quand la variable est définie.

Merci

+0

[Cela répond à la même question pour C++.] (Http://stackoverflow.com/questions/1410563/what-is-the-difference-between-a-definition-and-a-declaration/1410632#1410632) Il y a des différences entre C et C++, mais pour ce que vous demandez ils ne s'appliquent pas. – sbi

+0

Notez que 'void test();' n'est pas la même chose que 'void test (void);'. Le second attrapera les erreurs où vous appelez 'test (foo);' au moment de la compilation. – nmichaels

Répondre

8

Définition d'une variable est lorsque vous allouer de la mémoire pour le stockage et peut-être d'attribuer une valeur. La déclaration est lorsque vous indiquez qu'une variable avec un nom et un type spécifiques existe, mais qu'une mémoire lui a déjà été allouée. L'utilisation du mot clé extern signifie que vous déclarez la variable sans la définir.

En ce qui concerne votre question spécifique, votre premier exemple est la déclaration et votre deuxième réponse est la définition.

+0

+1 pour une réponse concise – ChrisBD

+0

Je viens juste de résumer le matériel du langage de programmation en C sur le sujet. Merci quand même. –

+2

Notez que '' int i; ''donne une définition de la variable. La lecture stricte de la norme C indique que si plus d'un fichier contient cet entête, alors vous obtiendrez plusieurs définitions pour 'i', et la phase de liaison de la compilation échouera. L'Appendice J (§J.5.11) donne une 'extension commune' comme: ** Plusieurs définitions externes ** Il peut y avoir plus d'une définition externe pour l'identifiant d'un objet, avec ou sans l'utilisation explicite du mot-clé 'extern'; si les définitions ne sont pas d'accord, ou plus de on est initialisé, le comportement n'est pas défini (6.9.2). –

0

Pour les variables automatiques et de registre, il n'y a pas de différence entre la définition et la déclaration. Le processus de déclaration d'une variable automatique ou d'une variable de registre définit le nom de la variable et alloue la mémoire appropriée. Cependant, pour les variables externes: Parce que la mémoire d'une variable ne doit être allouée qu'une seule fois, pour garantir que l'accès à la variable se réfère toujours à la même cellule. Toutes les variables doivent être définies une seule fois et une seule fois.

Si une variable externe doit être utilisée dans un fichier autre que celui dans lequel elle est définie, un mécanisme est nécessaire pour "connecter" une telle utilisation à la cellule de variable externe définie de manière unique qui lui est allouée. Ce processus de connexion des références de la même variable externe dans différents fichiers est appelé résolution des références.

Il peut être défini et déclaré avec une déclaration en dehors de toute fonction, sans spécificateur de classe de stockage. Une telle déclaration alloue de la mémoire pour la variable. Une déclaration de déclaration peut également être utilisée pour déclarer simplement un nom de variable avec le spécificateur de classe de stockage externe au début de la déclaration. Une telle déclaration spécifie que la variable est définie ailleurs, c'est-à-dire que la mémoire de cette variable est allouée dans un autre fichier. Ainsi, l'accès à une variable externe dans un fichier autre que celui dans lequel elle est définie est possible si elle est déclarée avec le mot-clé extern; aucune nouvelle mémoire n'est allouée. Une telle déclaration indique au compilateur que la variable est définie ailleurs et que le code est compilé avec la variable externe non résolue. La référence à la variable externe est résolue pendant le processus de liaison.

Ex. 
Code: 

    //file1.c 
    extern char stack[10];  
    extern int stkptr; 
    .... 

    //file2.c  
    char stack[10];  
    int stkptr; 
    .... 

Ces déclarations indiquent au compilateur que les variables pile [] et stkptr sont définis ailleurs, habituellement dans un autre fichier. Si le mot-clé extern était omis, les variables seraient considérées comme nouvelles et la mémoire leur serait allouée. Rappelez-vous que l'accès à la même variable externe définie dans un autre fichier n'est possible que si le mot-clé extern est utilisé dans la déclaration.

+3

[Nice couper et coller le travail là.] (Http://ee.hawaii.edu/~tep/EE160/Book/chap14/subsection2.1.1.4.html) –

+1

Trois réponses sur quatre qu'il a donné sont sans attribution couper et coller des emplois. Je l'ai mis dans le coin. – Will

Questions connexes