Domanda

Questo è l'errore che sto ottenendo quando si cerca di compilare un codice che utilizza taucs (non è il mio codice):

.../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? Si è in conflitto con se stessa?

Dopo mi sono pizzicato, ho creato un colpo di testa di prova e mettere in una definizione in conflitto, solo per assicurarsi che avevo ragione su questo:

Nel file di testit.h:

#include "somethingelse.h"

typedef struct
{
  int n;
} foobar;

Nel file di somethingelse.h:

typedef struct
{
  int n;
} foobar;

Certo, basta, ottengo:

testit.h:6: error: conflicting declaration ‘typedef struct foobar foobar’
somethingelse.h:4: error: ‘foobar’ has a previous declaration as ‘typedef struct foobar foobar’

O se ho questo in 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’

Il numero di riga è sempre diversa - una dichiarazione non può conflitto con se stesso. Io non capisco. Chiunque abbia mai visto questo?

È stato utile?

Soluzione

Potrebbe essere che il file di intestazione (.../taucs/src/taucs.h), che contiene la dichiarazione, è (direttamente o indirettamente) incluso due volte da due direttive #include separate?

Altri suggerimenti

È la sola intestazione incluso nel più file di origine? Se è così, è necessario avvolgerlo in "includere guardie" in questo modo:

#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’

In questo esempio si dà 2 dichiarazioni di foobar. Il compilatore non sa quale scegliere - così è balle con contrastanti dichiarazione. Non è possibile dichiarare la stessa cosa due volte.

Non ripetere la definizione. C ++ permette una definizione di apparire solo una volta. Che cosa si può fare è ripetere una dichiarazione.

Un typedef è sempre una definizione. Quindi la prima cosa che vi consiglio è dare il struct corretto un nome (e poiché questo è C ++, un typedef non aggiunge alcun beneficio quindi basta cadere il typedef):

// file1.h
struct foobar
{
    int n;
};

Avanti, che dovrebbe essere esattamente un unico file. Se si dispone di file che utilizzano solo puntatori a foobar, è possibile ripetere la dichiarazione (non solo la definizione):

// file2.h

// This is just a declaration so this can appear as many times as
// you want
struct foobar;

void doit(const foobar *f); 

Ho avuto lo stesso problema linting il mio codice ed è stato non doppia dichiarazione di un tipo. PC-Lint lamentava stesso typedef viene utilizzato in mista C e il codice C ++. Ho potuto risolvere che, evitando la stessa dichiarazione in C e file C ++. La speranza che aiuta qualcuno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top