Bonjour, je suis désolé d'intervenir sur quelque chose d'aussi basique mais je ne comprend pas bien l'intérêt des inclusions sécurisées. En fait j'ai eu des problèmes de liens sur un programme et j'ai donc fais des essais sous Microsoft Visual C++ 6.0 qui m'ont amené les mêmes erreurs. Je m'explique : J'ai fais un header head.h et deux source files main.cpp et head.cpp qui incluent tous deux head.h. Voici simplement le head.h :
J'ai implémenté clacla::clacla(), clacla::truc() et machin() dans head.cpp et pas de problèmes. Hors je retire simplement les commandes du préproceseur dans head.h, c'est à dire les #ifndef TRUC_H #define TRUC_H #endif, et cela continue de fonctioner. Apperement j'ai lu que l'on pouvait déclarer deux fois une variable à condition que le type corresponde exactement. Mais j'ai lu aussi que lorsqu'on écris int b; la variable est initialisé donc b est défini et il faut donc ecrire extern pour considéré qu'elle est seulement déclaré. Donc tout paraît normal. Mais si je rajoute la sécurité (#ifndef TRUC_H #define TRUC_H #endif) et que j'enlève le extern avant int b; cela ne fonctionne plus j'ai une erreur de lien :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #ifndef TRUC_H #define TRUC_H class clacla { public: float a; clacla(); int truc(); }; int machin(); extern int b; #endif
Je ne peux donc rien définir dans mon head.h, il va s'en dire que je ne peux pas espérer initialiser b à 0 par exemple. Dois-je en conclure que ma sécurité c'est du vent???? Logiquement il me semble qu'il devrait zaper le second passage dans head.h car TRUC_H est sensé être déjà défini. Je ne comprend donc pas l'intérêt de la sécurité d'inclusion si on ne peut que décalrer et non définir des variables ou des fonctions vu que sans ça marche quand même dans ce cas. Quelqu'un peut il m'éclairer??? J'ai forcement fais une erreur ou tres mal compris un point! Merci d'avance!main.obj : error LNK2005: "int b" (?b@@3HA) already defined in head.obj
Partager