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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top