Multiple definition of [Résolu]

Signaler
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009
-
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009
-
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

Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
20 janvier 2013

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, ....
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
dans common.c
int mavar;

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

ciao...
BruNews, MVP VC++
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009

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 : /
Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
20 janvier 2013

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.
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
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++ (@++)<!--
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009

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
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
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++ (@++)<!--
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009

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];
Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
20 janvier 2013

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
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009

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
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009

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_
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Statut
Membre
Dernière intervention
14 avril 2009

bon ca marche lol :)
j'ai utilise un autre nom moins standard et y'a plus de probleme : /

Merci pour l'aide