Multiple definition of [Résolu]

Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Dernière intervention
14 avril 2009
- - Dernière réponse : Yunchi
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
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 : /
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Dernière intervention
20 janvier 2013
3
Merci
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, ....

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 118 internautes nous ont dit merci ce mois-ci

Commenter la réponse de ctx_man
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
34
0
Merci
dans common.c
int mavar;

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

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Dernière intervention
14 avril 2009
0
Merci
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 : /
Commenter la réponse de Yunchi
Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Dernière intervention
20 janvier 2013
0
Merci
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.
Commenter la réponse de ctx_man
Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
Dernière intervention
16 février 2009
10
0
Merci
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++ (@++)<!--
Commenter la réponse de SAKingdom
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Dernière intervention
14 avril 2009
0
Merci
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
Commenter la réponse de Yunchi
Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
Dernière intervention
16 février 2009
10
0
Merci
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++ (@++)<!--
Commenter la réponse de SAKingdom
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Dernière intervention
14 avril 2009
0
Merci
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];
Commenter la réponse de Yunchi
Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Dernière intervention
20 janvier 2013
0
Merci
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
Commenter la réponse de ctx_man
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Dernière intervention
14 avril 2009
0
Merci
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
Commenter la réponse de Yunchi
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Dernière intervention
14 avril 2009
0
Merci
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_
Commenter la réponse de Yunchi
Messages postés
100
Date d'inscription
lundi 30 octobre 2006
Dernière intervention
14 avril 2009
0
Merci
bon ca marche lol :)
j'ai utilise un autre nom moins standard et y'a plus de probleme : /

Merci pour l'aide
Commenter la réponse de Yunchi

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.