Bonjour,
[Bien que les débats sous mon dernier post ne semblent pas terminés, je me permets de reposter ce qui devrait être un très court topic]
Voici le contenu d’un très court fichier autre.c :
int toto = 0;
Son fichier .h associé :
#ifndef AUTRE_H
#define AUTRE_H
extern int toto;
#endif
Voici le contenu d’un (très court) fichier main.c :
#include "autre.h"
int toto;
int main()
{
return 0;
}
Tout ceci compile sans problème. Je m’attendais à un problème de multiple définition de toto qui est une variable globale accessible partout dans mes deux fichiers et dans tout mon projet, mais non. Si je pousse le raisonnement, je peux donc include <errno.h> dans mon projet, sans forcément savoir que la variable errno est déclarée dans le fichier errno.c, et donc de mon point de vue ma variable errno peut se mettre à changer de valeur toute seule sans mon code, parce que le code de la librairie standard va la faire changer ? Donc quand j’inclus un .h de la librarie standard je dois bien me renseigner sur toutes les variables définies dedans au risque d’avoir un comportement complètement imprévisible ? Il ne me semble pas avoir entendu parler d’une telle précaution à prendre dans le cours… De plus cela pose un problème supplémentaire : si on n’inclut pas le .h de stdio par exemple, est-ce que le linker va lier mon projet avec le code de stdio.o (si c’est bien comme cela qu’il s’appelle ?) ? Est-ce que le linker va détecter tout seul qu’un .h de la librairie standard du C est inclus dans une de mes sources, et il va donc lier le code qu’il faut seulement si besoin ? Si ce n’est pas le cas et que le code de la librairie standard est toujours lié à mon projet même si je n’inclus pas les .h associés, alors on n’est jamais à l’abri qu’une variable déclarée dans mes sources interfère avec les variables globales déclarées dans les sources de la librairie standard ?
Par acquis de conscience j’ai aussi essayé avec ce code pour main.c :
#include "autre.h"
int toto = 0; //cette fois on met à 0 toto dans main.c
int main()
{
return 0;
}
Et cette fois ça ne compile pas. Un contournement du problème serait-il de toujours initialiser à la main nos variables globales ? (je dis à la main car elles sont initialisées à 0 automatiquement je crois)