"Neudefinition von 'foo' als andere Symbolart"
Ich versuche zu überarbeiten und bringen-über einige alte code, und ich lief über so etwas wie dieses:
struct foo;
typedef struct foo * foo;
Wenn Sie versuchen, um es zu kompilieren, bekomme ich die folgende Art von Fehlermeldung:
Source/Types/Types.h:27:18: error: redefinition of 'foo' as different kind of symbol typedef struct foo * foo; ^
Weiß jemand, was dies verursacht? Ich habe Sie nicht berührt, den code in eine lange Zeit, aber ich sicherlich erinnere mich an keinen Fehler in Bezug auf dass. Es ist einige der am core-code in der codebase, alles hängt davon ab; ich sehe nicht, wie könnte ich möglicherweise übersehen, wie einen eklatanten Fehler, wenn es ist in der Tat ein Fehler. Da die original - foo
ist ein "struct tag" (nur eine vernünftige Referenz nach der struct
keyword), wie kann es einen Konflikt mit meinem neuen foo
typedef schreiben?
Edit 1: Hier ist die gesamte tatsächliche Datei, vielleicht bin ich etwas fehlt, aber es scheint ziemlich geradlinig. Es sichert eine tötete der gleiche Fehler oben beschrieben, für jeden Typ:
# if !defined(TYPE_DECLARATIONS)
# define TYPE_DECLARATIONS
# include "Core.h"
# warning "in Core.h"
static int class = 0; //to prove I’m not compiling as C++
struct e(fork);
typedef struct e(fork)* e(fork);
struct e(execution);
typedef struct e(execution)* e(execution);
struct e(thing);
typedef struct e(thing) e(thing);
struct e(typeRepresentation);
typedef struct e(typeRepresentation)* e(typeRepresentation);
struct e(typeRepresentation) {
void * family;
char name[64]; };
struct e(thing) {
void * const pointer;
e(typeRepresentation) const isa; };
# endif //!defined(TYPE_DECLARATIONS)
(Auch, ignorieren die e()
makro; es ist ein noop in diesem Fall).
- Code kompiliert, kein problem für mich. Welchen compiler benutzt du? Ich bin auf gcc 4.3.3
clang --version
#=> 2.8- Es wirklich scheint, dass Sie versuchen zu kompilieren, als
C++
. Versuchen Sieint class;
irgendwo passend und überprüfen Sie, ob der compiler meckert 🙂 static int class = 0;
im globalen Bereich rechts vor dem anderen code führt keine neuen Fehler
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ah, ich löste mein eigenes problem. Ich schaffte es zu versauen mein
e()
makro, so dass es war buchstäblich preforming ein noop, entfernen Sie den code in Frage. :OIch bin ein idiot. Sorry für die Verschwendung jedermanns Zeit.
Sind Sie jetzt kompilieren als C++, in der Erwägung, dass es kompiliert, wie C?
In C++ struct und enum-tags Leben im gleichen namespace wie die anderen Typ-Namen.
clang -std=c99 -pedantic-errors -Wall -O0 ...
)struct
,union
oderenum
- tag verwendet werden kann als ein Typ ohne das Schlüsselwort " falls es gibt keine anderen Bezeichner (Typ, Funktion, variable,...) mit diesem Namen.typedef
mit unterschiedlicher Semantik alsstruct foo
. Aber dein zweiter Satz ist falsch. E. gstruct foo; foo* foo;
ist gültig für C++, ungültig C.struct foo foo; struct foo* foo;
ist gültig für beide.typedef struct foo foo;
auch. Abertypedef struct foo foo; foo* foo;
ist dann ungültig für beide.ordnen Sie die Namen foo mit zwei verschiedenen Arten. struct foo und einen Zeiger auf struct foo verschiedene Arten.
Es ist legal C, aber nicht legal in C++. Sind Sie zufällig versucht, zu kompilieren mit einem C++ - compiler? Mein gcc kann kompilieren Sie Ihren code perfekt, wie es sein sollte.