Variables globales pour compilation séparée
Bonjour
Je développe un code en C, qui comporte déjà plusieurs fichiers source. Afin d'en faire le code le plus pro possible, j'essaie de respecter au maximum les recommandation de codage.
Ayant plusieurs variables globales, voici mon problème :
Pour l'instant, je fais la déclaration de définition dans un fichier en-tête Entete.h qui est inlut dans tous mes fichiers **.c.
Or, j'ai lu sur plusieurs sites que cette pratique est déconseillée car elle mène à des inclusions multiples si le fichier est inclu plusieurs fois (ce qui est le cas dans mon code, ou Entete.h est inclus dans chacun de mes fichiers **.c). mon code est donc de ce type :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
#include <stdio.h>
#include <math.h>
#include "Entete.h"
/*******************************************************************************
* MAIN
******************************************************************************/
int main(void)
{
void f1( void );
t=0;
dt=0.1;
f1();
printf("%f",t);
return 0;
} |
fichier aux.c :
Code:
1 2 3 4 5 6 7 8
|
#include "Entete.h"
void f1( void )
{
t+=dt;
return;
} |
fichier Entete.h :
Concrètement, quel est le problème qui peut se poser ? Car ma compilation ne donne aucune erreur et que le code s'éxécute normalement.
J'ai lu par ailleurs que pour éviter les inclusions multiples, les fichiers en tête devaient être protégés par des macros comme ceci :
Code:
1 2 3 4 5 6 7 8
|
#ifndef H_ENTETE_H
#define H_ENTETE_H
double t;
double dt;
#endif |
Cela est-il suffisant ? J'ai lu aussi qu'il fallait mieux, pour être sûr de ne faire les déclarations de définitions qu'une seule fois, de faire celles-ci dans un fichier **.c et de mettre dans le header la déclaration de référence (du style "externe double t") qui sera rappellée dans le nombre de fichier nécessaire au travers de l'"include".
(cela donnerait le code suivant :
main.c :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
#include <stdio.h>
#include <math.h>
#include "Entete.h"
int t;
int dt;
/*******************************************************************************
* MAIN
******************************************************************************/
int main(void)
{
void f1( void );
t=0;
dt=0.1;
f1();
printf("%f",t);
return 0;
} |
fichier aux.c :
[/CODE]
fichier aux.c :
Code:
1 2 3 4 5 6 7 8
|
#include "Entete.h"
void f1( void )
{
t+=dt;
return;
} |
fichier entête :
Code:
1 2 3 4 5 6 7 8
|
#ifndef H_ENTETE_H
#define H_ENTETE_H
extern double t;
extern double dt;
endif |
)
Quelle est la différence entre ces deux méthodes ? Laquelle est nécessaire ? Les deux ?
Merci à toutes les bonnes volontés, car je suis malgré tout bien embrouillée
L.