¿Cómo puede un conflicto con la declaración en sí?
Pregunta
Este es el error que estoy consiguiendo al intentar compilar un código que utiliza taucs (no es mi código):
.../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? Que está en conflicto consigo misma?
Después de que me pellizqué, he creado una cabecera prueba y poner en una definición de conflicto, sólo para asegurarse de que tenía razón en esto:
En testit.h archivo:
#include "somethingelse.h"
typedef struct
{
int n;
} foobar;
En somethingelse.h archivo:
typedef struct
{
int n;
} foobar;
Efectivamente, me sale:
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 si tengo esto 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’
No puede una declaración conflicto consigo mismo - El número de línea es siempre diferente. Yo no lo entiendo. Alguien ha visto esto?
Solución
¿Es posible que el archivo de cabecera (.../taucs/src/taucs.h
), que contiene la declaración, es (directa o indirectamente) incluida en dos ocasiones por dos directivas #include
separados?
Otros consejos
Es la única cabecera incluida en varios archivos de origen? Si es así, es necesario envolver en "incluyen guardias" de esta manera:
#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’
En este ejemplo se dan 2 declaraciones de foobar. El compilador no sabe cuál elegir - por lo que rescata a la declaración de conflicto. No se puede declarar lo mismo dos veces.
No repetir la definición. C ++ permite una definición que aparezca sólo una vez. Lo que puede hacer es repetir una declaración.
A typedef
es siempre una definición. Así que la primera cosa que recomendaría es dar la adecuada struct
un nombre (y ya que este es C ++, un typedef no añade ningún beneficio por lo que sólo deje caer el typedef):
// file1.h
struct foobar
{
int n;
};
A continuación, que debe estar exactamente en un solo archivo. Si tiene archivos que sólo se utilizan punteros a foobar, puede repetir la declaración (no la definición):
// file2.h
// This is just a declaration so this can appear as many times as
// you want
struct foobar;
void doit(const foobar *f);
Yo tenía el mismo problema linting mi código y fue no doble declaración de un tipo. PC-Lint quejó de la misma typedef se utiliza en mixto C y el código C ++. Podría arreglar eso, evitando la misma declaración en C y los archivos C ++. Esperanza de que ayude a alguien.