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?
Réponses
Trop de publicités?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). .
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
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.
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.
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.