Probleme de preprocesseur

[Résolu]
Signaler
Messages postés
134
Date d'inscription
vendredi 2 mai 2003
Statut
Membre
Dernière intervention
14 novembre 2009
-
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
-
Bonjour, j'ai un fichier d'en tête .h inclut partout ou il y as:

#ifndef INCLUDE_ENV_H
#define INCLUDE_ENV_H

//debug level, 0: no debug, 10 critical and internal error, 50 show main activity, 90 debug mode, more than 100 is useless.
#define DEBUG 100

#if (DEBUG>0)
    #define DEBUGCONSOLE(a,b) debug_console_fonction(a,b)
    #include
    using namespace std;
    #include <QString>
    void debug_console_fonction(int number,QString text)
    {
        if(number>=DEBUG)
            cout << qPrintable(text) << "\n";
    }
#else
    #define DEBUGCONSOLE(a,b) //a,b
#endif
//...
#endif

Et il me dit que je redéfini la fonctiondebug_console_fonction():

CopyThread.o: In function `debug_console_fonction(int, QString)':
CopyThread.cpp:(.text+0x710): multiple definition of `debug_console_fonction(int, QString)'
AddFolderThread.o:AddFolderThread.cpp:(.text+0xf20): first defined here
Ewindow.o: In function `debug_console_fonction(int, QString)':
Ewindow.cpp:(.text+0x130): multiple definition of `debug_console_fonction(int, QString)'
AddFolderThread.o:AddFolderThread.cpp:(.text+0xf20): first defined here
FEwindow.o: In function `debug_console_fonction(int, QString)':
FEwindow.cpp:(.text+0xaa0): multiple definition of `debug_console_fonction(int, QString)'
AddFolderThread.o:AddFolderThread.cpp:(.text+0xf20): first defined here
main.o: In function `debug_console_fonction(int, QString)':
main.cpp:(.text+0x120): multiple definition of `debug_console_fonction(int, QString)'
AddFolderThread.o:AddFolderThread.cpp:(.text+0xf20): first defined here
Mwindow.o: In function `debug_console_fonction(int, QString)':
Mwindow.cpp:(.text+0x16c0): multiple definition of `debug_console_fonction(int, QString)'
AddFolderThread.o:AddFolderThread.cpp:(.text+0xf20): first defined here

5 réponses

Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Si tu veux utiliser printf dans 2 fichiers .c/.cpp, il faudra bien inclure stdio.h dans chacun d'eux. Même principe ici.
#ifndef ...
#define...
...
#endif
empêche seulement que le .h soit réinclus plusieurs fois dans un même fichier source (.c/.cpp).

C++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Normal. Partout ou tu inclus ton header, il redéfinit ta fonction.
2 solutions:
soit tu déclare cette fonction dans un .c puis tu ne met que son prototype dans le header
soit tu déclare cette fonction en inline:

inline void debug_console_fonction(int number,QString text)
    {
        if(number>=DEBUG)
            cout << qPrintable(text) << "\n";
    }

C++ (@++)<!--
Messages postés
134
Date d'inscription
vendredi 2 mai 2003
Statut
Membre
Dernière intervention
14 novembre 2009

Pourtant j'ai mit
#ifndef INCLUDE_ENV_H
#define INCLUDE_ENV_H
#endif
qui enpéche le redefinition multiple.

Ca fait quoi inline?
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Non apparemment, cette solution (inline) ne fonctionne pas avec gcc.

Prend l'autre solution dans ce cas.

C++ (@++)<!--
Messages postés
134
Date d'inscription
vendredi 2 mai 2003
Statut
Membre
Dernière intervention
14 novembre 2009

Re, je veux comprendre:


Pourtant j'ai mit
#ifndef INCLUDE_ENV_H
#define INCLUDE_ENV_H
#endif
qui enpéche le redefinition multiple.
http://www.first-world.info/