Frage

Das ist der Fehler, den ich immer bin, wenn sie versuchen einige Code, Anwendungen taucs (nicht mein Code) zu kompilieren:

.../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? Es steht in Konflikt mit sich selbst?

Nachdem ich mich gekniffen, habe ich einen Test-Header und in eine widersprüchliche Definition, nur um sicherzustellen, dass ich Recht hatte dazu:

In der Datei testit.h:

#include "somethingelse.h"

typedef struct
{
  int n;
} foobar;

In der Datei somethingelse.h:

typedef struct
{
  int n;
} foobar;

Sicher genug, erhalte ich:

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

Oder, wenn ich dies 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’

Die Zeilennummer ist immer anders - eine Erklärung kann nicht in Konflikt mit sich selbst. Ich verstehe es nicht. Wer dies jemals gesehen?

War es hilfreich?

Lösung

Könnte es sein, dass Ihre Header-Datei (.../taucs/src/taucs.h), die die Erklärung enthält, ist (direkt oder indirekt) enthalten zweimal durch zwei separate #include Richtlinien?

Andere Tipps

Ist der einzelnen Header in mehrere Quelldateien enthalten? Wenn ja, müssen Sie es wickeln in „gehören Wachen“ in etwa so:

#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 diesem Beispiel geben Sie 2 Erklärungen von foobar. Der Compiler weiß nicht, welches man wählen - so es bürgt aus mit Erklärung in Konflikt. Sie können die gleiche Sache zweimal nicht erklären.

Do die Definition nicht wiederholen. C ++ ermöglicht eine Definition nur einmal erscheinen. Was können Sie tun, ist eine Erklärung wiederholen.

Ein typedef ist immer eine Definition. Das erste, was richtig, einen Namen für die struct gibt ich empfehlen würde, ist (und da diese C ++, ist ein typedef keinen Nutzen hinzufügen, so fällt nur die typedef):

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

Als nächstes wird das sollte in genau eine Datei sein. Wenn Sie Dateien, die nur Zeiger auf foobar verwenden, können Sie wiederholen Sie die Deklaration (nur nicht die Definition):

// file2.h

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

void doit(const foobar *f); 

Ich hatte das gleiche Problem meinen Code Fusseln und es war nicht doppelte Erklärung eines Typs. PC-Lint beschwerten sich über die gleiche typedef wird in gemischten C und C ++ Code verwendet. Ich könnte das Problem beheben, indem die gleiche Erklärung in C zu vermeiden und C ++ Dateien. Hoffnung, dass jemand hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top