Multiple definition of [Résolu]

Yunchi 100 Messages postés lundi 30 octobre 2006Date d'inscription 14 avril 2009 Dernière intervention - 24 juil. 2007 à 04:42 - Dernière réponse : Yunchi 100 Messages postés lundi 30 octobre 2006Date d'inscription 14 avril 2009 Dernière intervention
- 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
ctx_man 285 Messages postés mardi 28 décembre 2004Date d'inscription 20 janvier 2013 Dernière intervention - 25 juil. 2007 à 09:48
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, ....

Merci ctx_man 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 124 internautes ce mois-ci

Commenter la réponse de ctx_man
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 24 juil. 2007 à 09:03
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
Yunchi 100 Messages postés lundi 30 octobre 2006Date d'inscription 14 avril 2009 Dernière intervention - 24 juil. 2007 à 09:14
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
ctx_man 285 Messages postés mardi 28 décembre 2004Date d'inscription 20 janvier 2013 Dernière intervention - 24 juil. 2007 à 12:07
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
SAKingdom 3213 Messages postés lundi 7 novembre 2005Date d'inscription 16 février 2009 Dernière intervention - 24 juil. 2007 à 15:57
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
Yunchi 100 Messages postés lundi 30 octobre 2006Date d'inscription 14 avril 2009 Dernière intervention - 25 juil. 2007 à 03:54
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
SAKingdom 3213 Messages postés lundi 7 novembre 2005Date d'inscription 16 février 2009 Dernière intervention - 25 juil. 2007 à 04:15
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
Yunchi 100 Messages postés lundi 30 octobre 2006Date d'inscription 14 avril 2009 Dernière intervention - 25 juil. 2007 à 04:55
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
ctx_man 285 Messages postés mardi 28 décembre 2004Date d'inscription 20 janvier 2013 Dernière intervention - 25 juil. 2007 à 08:10
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
Yunchi 100 Messages postés lundi 30 octobre 2006Date d'inscription 14 avril 2009 Dernière intervention - 25 juil. 2007 à 09:16
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
Yunchi 100 Messages postés lundi 30 octobre 2006Date d'inscription 14 avril 2009 Dernière intervention - 25 juil. 2007 à 09:21
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
Yunchi 100 Messages postés lundi 30 octobre 2006Date d'inscription 14 avril 2009 Dernière intervention - 25 juil. 2007 à 10:05
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.