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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top