Comment une déclaration de conflit avec lui-même?
C'est l'erreur que je reçois lorsque vous essayez 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 je me suis pincé, j'ai créé un test en-tête et le mettre dans un conflit de définition, juste pour m'assurer que j'ai raison sur ce point:
Dans le fichier testit.h:
#include "somethingelse.h"
typedef struct
{
int n;
} foobar;
Dans le fichier somethingelse.h:
typedef struct
{
int n;
} foobar;
Bien sûr, j'obtiens:
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 cela 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 la ligne est toujours différent, une déclaration peut pas entrer en conflit avec lui-même. Je n'ai pas l'obtenir. - On jamais vu cela?
OriginalL'auteur eeeeaaii | 2010-08-24
Vous devez vous connecter pour publier un commentaire.
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#include
directives?OriginalL'auteur Timwi
Est le seul en-tête inclus dans plusieurs fichiers sources? Si oui, vous devez envelopper dans "inclure les gardes" de la sorte:
Aussi les de fuite double soulignement. Une forme correcte serait
TAUCS_H
. C et C++ pour les programmeurs de ne pas utiliser des macros avec _H suffixes pour d'autres fins, c'est assez sûr, sans plus de décoration.mis à jour pour refléter la bonne entrée.
OriginalL'auteur Harper Shelby
Dans cet exemple, vous donner 2 déclarations de foobar. Le compilateur ne sait pas lequel choisir - donc, il écope en conflit avec la déclaration. Vous ne pouvez pas déclarer deux fois la même chose.
OriginalL'auteur David Feurle
Ne répétez pas la définition. C++ permet une définition à n'apparaissent qu'une seule fois. Ce que vous pouvez faire est de répéter une déclaration.
Un
typedef
est toujours une définition. Donc la première chose que je recommande est de donner lestruct
bon un nom (et depuis c'est le C++, un typedef ne pas ajouter de la prestation ainsi il suffit de déposer le typedef):Prochaine, qui devrait être dans un seul fichier. Si vous avez des fichiers qui utilisent uniquement des pointeurs de foobar, vous pouvez répéter la déclaration (tout simplement pas la définition):
OriginalL'auteur R Samuel Klatchko
J'ai eu le même problème peluchage mon code et il a été pas double déclaration d'un type. PC-Peluches se sont plaints de la même typedef être utilisé en mélange de code C et C++. Je pouvais résoudre ce problème en évitant la même déclaration en C et fichiers C++. Espérons que l'aide à quelqu'un.
OriginalL'auteur Thomas Höhenleitner