Multiple definition of

Résolu
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009 - 24 juil. 2007 à 04:42
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009 - 25 juil. 2007 à 10:05
Bonjour,

J'ai une bibliotheque perso bib.h dans laquelle j'ai mis des variables globales dont une qui est 'int LINE_LENGHT = 200;' declaree entre les #include et les prototypes. Je me sers de cette variable pour declarer ensuite des tableau de char qui doivent avoir la meme taille donc cette variable me permettrait s'il fau changer la taille de ces tableau ne changer qu'une seule variable.

Par exemple dans fonction_file.c j'ai un 'char buffer[50][LINE_LENGHT];' et dans organisation.c j'ai un 'char temp[LINE_LENGHT];'. Lorsque je compile j'ai des erreurs : multiple definition of 'LINE_LENGHT' .... pourtant j'ai d'autre variables globales dont je me sers dans plusieurs fonctions dans plusieurs .c differents et il n'y a aucun probleme ....

Si quelqu'un sait d'ou vien ce probleme ....

ps : j'ai cherche sur le forum et il y a eu pas mal de post sur ce probleme mais je n'ai pas trouve de reponse a mon probleme : /
A voir également:

12 réponses

ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
25 juil. 2007 à 09:48
Oui c'est de ma faute j'ai été trop vite en besogne :

#ifdef LINE_LENGHT //Si LINE_LENGHT a déjà été défini
#undef LING_LENGHT //On le supprime des definitions du preprocesseur
#endif //Ferme le #ifdef
#define LINE_LENGHT 200 //On ajoute LINE_LENGHT

cependant tu ne peux remplacer ifdef par ifndef
Le but ici c'est que si le préprocesseur connai déjà un LINE_LENGHT (déclarer quelques part dans tes includes) on lui fasse oublier cette ancienne définition.
De cette mannière, que le preprocesseur connaisse ou non LINE_LENGHT, c'est ton #define qui sera prit en compte.

Cependant je répète qu'il est préférable que tu change le nom de ton LINE_LENGHT car celui qui est définit dans tes includes est peut-etre utilisé en interne par des macro et si tu en utilise (souvent sans le savoir) tu modifie leur comportement. Aussi, il est préférable de changer le nom de ton define en mettant par exemple LENGHT_OF_LINE ou LINELENGHT, ....
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 juil. 2007 à 09:03
dans common.c
int mavar;

dans common.h
#ifndef COMMON_H
#define COMMON_H
extern int mavar;
#endif

ciao...
BruNews, MVP VC++
0
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009
24 juil. 2007 à 09:14
en fait le probleme c'est que je me sers de cette variable definie dans bib.h pour declarer des tableaux de caracteres dans mes .c

par ex dans un .c j'ai " char temp[200]; "

j'ai essayer avec un #define LINE_LENGHT 200 mais toujours le meme probleme : /
0
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
24 juil. 2007 à 12:07
Salut !
Il y a fort à parier que quelque chose s'apelle déjà LINE_LENGHT dans un des includes que tu fait au dessus.
exemple :
dans truc.h
int LINE_LENGHT = XXXXX;

dans bib.h
int LINE_LENGHT = 200;

dans fonction_file.c :
#include "bib.h" //Premiere définition de LINE_LENGHT
#include "truc.h" //Seconde définition de LINE_LENGHT => Erreur

char buffer[50][LINE_LENGHT]; //Quel définition utiliser ?
Solution : change le nom de ta variale globale.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
24 juil. 2007 à 15:57
Une variable déclaré dans un header ?
Ben tu pourrais faire quelque chose comme:

#ifndef MYVAR
#define MYVAR
int myvar = 10;
#else
extern int myvar;
#endif

Cependant, la méthode qu'a proposé BruNews fais tout aussi bien et est bien plus propre.

.c
int myvar = 10;

.h
#ifndef _HEADER_INCL // Début du .h
#define _HEADER_INCL
...
extern int myvar;
...
#endif // Fin du .h

Simple remarque au passage. Ce message est dans le thème C. Cependant, il est impossible de donner, pour taille d'un tableau, une variable en C.
Cette valeur DOIT être constante (et je ne parle pas de variable constante ici (const int)).

C++ (@++)<!--
0
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009
25 juil. 2007 à 03:54
ah donc il n'est pas possible de declarer un tableau de char avec une variable ....

J'ai egalement essayer de mettre #define LINE_LENGHT 200 pour ensuite pouvoir declarer mon tableau de char avec char temp[LINE_LENGHT]; mais j'ai eu egalement le probleme du multiple definition of

J'ai scanner l'ensemble des fichiers de mon projet et il n'y a pas d'autre LINE_LENGHT a part celui defini dans la bibliotheque

Donc quel serait la methode si par exemple dans l'ensemble de mes .c jai plusieur declaration int nb[LINE_LENGHT]; ou char temp[LINE_LENGHT];. Comment devrais je declarer ce LINE_LENGHT dans ma bibliotheque afin que lorsque je veux changer cette valeur je n'ai qu'a le faire une fois et non pour l'ensemble de mes variables.

Merci
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
25 juil. 2007 à 04:15
Ton #define LINE_LENGHT 200 est dans ton bib.h ?
Ajoute tout simplement ceci au tout début du .h

#ifndef _BIB_INCL
#define _BIB_INCL

et ceci à la toute fin

#endif

C++ (@++)<!--
0
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009
25 juil. 2007 à 04:55
oui je sais quand meme faire une bibliotheque perso :)

bib.h :

#ifndef _BIB_
#define _BIB_

#include <stdlib.h>
#include <gtk/gtk.h>
#include <string.h>
#include <windows.h>

//#define LINE_LENGHT 200

#endif

et apres dans un .c j'ai
char temp[LINE_LENGHT];

et dans un autre .c j'ai
char buffer[50][LINE_LENGHT];
0
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
25 juil. 2007 à 08:10
Ah c'est un define ! tu avais ecrit "int LINE_LENGHT = 200"
dans ce cas la :

bib.h :

#ifndef _BIB_
#define _BIB_

#include <stdlib.h>
#include <gtk/gtk.h>
#include <string.h>
#include <windows.h>

#ifdef LINE_LENGHT //Si LINE_LENGHT a déjà été défini
#undef LING_LENGHT //On le supprime des definitions du preprocesseur
#define LINE_LENGHT 200 //On ajoute LINE_LENGHT

#endif

Ca devrait marcher. Sauf que si tu as besoin du LINE_LENGHT contenu dans un des #include que tu fait, ben tu es mal barré ! lol
0
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009
25 juil. 2007 à 09:16
bah en fait j'ai tester les deux

en declarant une variable globale int LINE_LENGHT = 200;
et en definissant comme une constante mais probleme dans les deux cas
0
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009
25 juil. 2007 à 09:21
en utilisant

#ifdef LINE_LENGHT //Si LINE_LENGHT a déjà été défini
#undef LING_LENGHT //On le supprime des definitions du preprocesseur
#define LINE_LENGHT 200 //On ajoute LINE_LENGHT

j'ai pleins d'erreurs bizarres qui apparassent ....

j'en ai un peu moins si je met #ifndef LINE_LENGHT a la place du #ifdef mais tjrs une erreur : " unterminated #ifndef " pointe vers #ifndef _BIB_
0
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009
25 juil. 2007 à 10:05
bon ca marche lol :)
j'ai utilise un autre nom moins standard et y'a plus de probleme : /

Merci pour l'aide
0
Rejoignez-nous