Wie kann eine Deklaration mit sich selbst kollidieren?

7

Dies ist der Fehler, den ich erhalte, wenn ich versuche, Code zu kompilieren, der taucs (nicht meinen Code) verwendet:

%Vor%

wat? Es widerspricht sich selbst?

Nachdem ich mich eingeklemmt habe, habe ich einen Testheader erstellt und eine widersprüchliche Definition eingefügt, nur um sicherzustellen, dass ich recht hatte:

In Datei testit.h:

%Vor%

In der Datei somethingselse.h:

%Vor%

Natürlich bekomme ich:

%Vor%

Oder wenn ich dies in testit.h habe:

%Vor%

Die Zeilennummer ist immer anders - eine Deklaration kann nicht mit sich selbst kollidieren. Ich verstehe es nicht. Wer hat das jemals gesehen?

    
eeeeaaii 24.08.2010, 02:58
quelle

5 Antworten

5

Könnte es sein, dass Ihre Header-Datei ( .../taucs/src/taucs.h ), die die Deklaration enthält, (direkt oder indirekt) zweimal von zwei separaten #include -Direktiven enthalten ist?

    
Timwi 24.08.2010, 03:02
quelle
14

Ist der einzelne Header in mehreren Quelldateien enthalten? Wenn ja, müssen Sie es wie folgt in "include guards" einfügen:

%Vor%     
Harper Shelby 24.08.2010 03:03
quelle
1
%Vor%

In diesem Beispiel geben Sie 2 Deklarationen von foobar. Der Compiler weiß nicht, welchen er wählen soll - also wird er mit einer widersprüchlichen Deklaration aussortiert. Sie können dasselbe nicht zweimal deklarieren.

    
David Feurle 24.08.2010 05:17
quelle
0

Wiederholen Sie die Definition nicht. C ++ ermöglicht, dass eine Definition nur einmal angezeigt wird. Was Sie tun können, ist eine Deklaration zu wiederholen.

A typedef ist immer eine Definition. Also das erste, was ich empfehlen würde, geben Sie der struct richtig einen Namen (und da dies C ++ ist, fügt ein typedef keinen Nutzen, also einfach die Typedef fallen lassen):

%Vor%

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

%Vor%     
R Samuel Klatchko 24.08.2010 05:30
quelle
0

Ich hatte das gleiche Problem mit meinem Code und es war nicht doppelte Deklaration eines Typs. PC-Lint beklagte sich über den gleichen Typdef, der in gemischtem C- und C ++ - Code verwendet wurde. Ich könnte das beheben, indem ich die gleiche Deklaration in C und C ++ Dateien vermeide. Hoffe das hilft jemandem.

    
Thomas Höhenleitner 17.05.2016 14:36
quelle

Tags und Links