Come può un conflitto con se stessa dichiarazione?
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?
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.