83 votes

Déclaration de variable dans un fichier d'en-tête

Si j'ai une variable qui peut être utilisée dans plusieurs sources - est-ce une bonne pratique de la déclarer dans un en-tête? ou vaut-il mieux le déclarer dans un fichier .c et utiliser extern dans d'autres fichiers?

149voto

Martin B Points 14919

Vous devez déclarer la variable dans un fichier d'en-tête:

 extern int x;
 

puis définissez- le dans un fichier C:

 int x;
 

En C, la différence entre une définition et une déclaration est que la définition réserve un espace pour la variable, alors que la déclaration introduit simplement la variable dans la table des symboles (et obligera l'éditeur de liens à le rechercher lorsqu'il s'agira du temps du lien). .

51voto

Henk Holterman Points 153608

Vous pouvez (devriez) le déclarer comme extern dans un fichier d'en-tête et le définir dans exactement 1 fichier .c.

Notez que ce fichier c doit également utiliser l'en-tête et que le modèle standard ressemble à ceci:

 // file.h
extern int x;  // declaration

// file.c
#include "file.h"
int x;  // definition and re-declaration, OK
 

21voto

Vicky Points 6749

Si vous le déclarez comme

 int x;
 

Dans un fichier d'en-tête qui est ensuite inclus à plusieurs endroits, vous obtiendrez plusieurs instances de x (et éventuellement des problèmes de compilation ou de liaison).

La bonne façon d’aborder ceci est d’avoir le fichier d’en-tête dit

 extern int x; /* declared in foo.c */
 

et puis dans foo.c vous pouvez dire

 int x; /* exported in foo.h */
 

Vous pouvez ensuite inclure votre fichier d'en-tête à autant d'endroits que vous le souhaitez.

4voto

Robert Points 5137

La clé est de conserver les déclarations de la variable dans le fichier d’en-tête et le fichier source.

J'utilise cette astuce

 ------sample.c------
#define sample_c
#include sample.h

(rest of sample .c)

------sample.h------
#ifdef sample_c
#define EXTERN
#else
#define EXTERN extern
#endif

EXTERN int x;
 

Sample.c n'est compilé qu'une fois et définit les variables. Tout fichier incluant sample.h ne reçoit que le "extern" de la variable; il alloue de l'espace pour cette variable.

Lorsque vous changez le type de x, cela changera pour tout le monde. Vous n'aurez pas besoin de vous souvenir de le changer dans le fichier source et le fichier d'en-tête.

0voto

Dom045 Points 26

En ce qui concerne l'utilisation de extern dans l'en-tête: quel genre de problèmes se produira si "extern" n'est pas utilisé dans le fichier d'en-tête?

J'ai vu des cas où extern n'était pas utilisé dans un fichier d'en-tête et inclus dans divers fichiers C sans problèmes.

Merci.

http://stackoverflow.com/a/1433387 link a la réponse à ma question. C'est assez long, mais détaillé. Bonne lecture.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X