Comment un conflit de déclaration avec lui-même?
Question
Ceci est l'erreur que je reçois en essayant de compiler un code qui utilise taucs (pas mon code):
.../taucs/src/taucs.h:554: error: conflicting declaration ‘typedef struct taucs_ccs_matrix taucs_ccs_matrix’
.../taucs/src/taucs.h:554: error: ‘taucs_ccs_matrix’ has a previous declaration as ‘typedef struct taucs_ccs_matrix taucs_ccs_matrix’
wat? Il est en conflit avec lui-même?
Après que je me suis pincé, je créé un en-tête de test et mis dans une définition contradictoire, juste pour que j'avais raison à ce sujet:
Dans le fichier testit.h:
#include "somethingelse.h"
typedef struct
{
int n;
} foobar;
Dans le fichier somethingelse.h:
typedef struct
{
int n;
} foobar;
Effectivement, je reçois:
testit.h:6: error: conflicting declaration ‘typedef struct foobar foobar’
somethingelse.h:4: error: ‘foobar’ has a previous declaration as ‘typedef struct foobar foobar’
Ou si j'ai en testit.h:
typedef struct
{
int n;
} foobar;
typedef struct
{
int n;
} foobar;
testit.h:9: error: conflicting declaration ‘typedef struct foobar foobar’
testit.h:4: error: ‘foobar’ has a previous declaration as ‘typedef struct foobar foobar’
Le numéro de ligne est toujours différente - une déclaration ne peut entrer en conflit avec lui-même. Je ne comprends pas. Quiconque a déjà vu ça?
La solution
Se pourrait-il que votre fichier d'en-tête (.../taucs/src/taucs.h
), qui contient la déclaration, est (directement ou indirectement) inclus deux fois par deux directives de #include
séparées?
Autres conseils
L'en-tête unique inclus dans les fichiers sources multiples? Si oui, vous avez besoin de l'envelopper dans « inclure les gardes » comme ceci:
#ifndef TAUCS_H
#define TAUCS_H
//Header stuff here
#endif //TAUCS_H
typedef struct
{
int n;
} foobar;
typedef struct
{
int n;
} foobar;
testit.h:9: error: conflicting declaration ‘typedef struct foobar foobar’
testit.h:4: error: ‘foobar’ has a previous declaration as ‘typedef struct foobar foobar’
Dans cet exemple, vous donner 2 déclarations de foobar. Le compilateur ne sait pas lequel choisir - il renfloue avec déclaration en conflit. Vous ne pouvez pas déclarer la même chose deux fois.
Ne pas répéter la définition. C ++ permet une définition apparaisse une seule fois. Ce que vous pouvez faire est de répéter une déclaration.
A typedef
est toujours une définition. La première chose que je recommande est de donner la bonne struct
un nom (et puisque c'est C ++, un typedef n'ajoute aucun avantage tomber de manière juste le typedef):
// file1.h
struct foobar
{
int n;
};
Ensuite, cela devrait être exactement un seul fichier. Si vous avez des fichiers qui utilisent uniquement des pointeurs vers foobar, vous pouvez répéter la déclaration (tout simplement pas la définition):
// file2.h
// This is just a declaration so this can appear as many times as
// you want
struct foobar;
void doit(const foobar *f);
J'ai eu le même problème peluchage mon code et il était pas à double déclaration d'un type. PC-Lint se plaignait de la même typedef utilisé dans mixte C et le code C. Je pouvais résoudre ce problème en évitant la même déclaration en C et fichiers C ++. L'espoir qui aide à quelqu'un.