2011-01-12 19 views
1

Betrachten Sie die folgende typedef struct in C:C typedef struct Unsicherheit

21:typedef struct source{ 
22: double ds;    //ray step 
23: double rx,zx;   //source coords 
24: double rbox1, rbox2; //the box that limits the range of the rays 
25: double freqx;   //source frequency 
26: int64_t nThetas;  //number of launching angles 
27: double theta1, thetaN; //first and last launching angle 
28:}source_t; 

ich den Fehler:
globals.h: 21: Fehler: Neudefinition von 'struct source'
globals.h: 28 : Fehler: Konflikt-Typen für 'source_t'
globals.h: 28: Anmerkung: vorherige Erklärung 'source_t' war hier

ich andere Formate für diese Definition versucht haben, mit:


struct source{ 
... 
}; 
typedef struct source source_t; 

und


typedef struct{ 
... 
}source_t; 

die beide denselben Fehler zurück. Warum passiert das? es sieht für mich vollkommen richtig aus.

+3

sieht aus wie die Datei "globals.h" wird zweimal aus den Quelldateien enthalten – SirDarius

+0

funktioniert perfekt für mich: http://ideone.com/kKj8q – eckes

+0

basierend auf SirDarius 'Kommentar: haben Sie einen ** reinclude Schutz eingerichtet ** in 'globals.h'? – eckes

Antwort

6

Sind Sie sicher, dass Sie Ihre Kopfzeile nicht zweimal eingegeben haben (ohne #ifndef/#pragma once zu verwenden, um das zu vermeiden)? Auch wenn es in Ihrem Konstrukt einen Fehler gab, sollte es nicht den Fehler "Neudefinition von ..." auslösen, weil es die erste Zeile ist?

+0

Ja, ich habe eine Datei eingeschlossen [die eine Datei enthielt (ein paar Mal wiederholen)], die globals.h enthielt. Gebrauchte '#pragma einmal 'und es hat Wunder gewirkt. _Way_ cleaner, dass Schreiben Wachen enthalten. Vielen Dank! –

+2

Bitte benutzen Sie beide - '# Pragma's sind Compiler-spezifisch. –

3

Die wahrscheinlichste Ursache ist, dass Ihre Headerdatei mehr als einmal enthalten ist. Sie müssen sicherstellen, dass in diesem Fall der typedef nur einmal ausgeführt wird.

Sie können dies durch Umwickeln globals.h mit:

#ifndef _globals_h_ 
    #define _globals_h_ 
    [...] 
    #endif 
+1

Bitte starten Sie Ihren Include-Symbolnamen nicht mit einem Unterstrich. Solche Namen sind für die Verwendung durch die Standardbibliotheksimplementierung reserviert. (Es gibt einige Ausnahmen, aber es ist besser, nicht mit Feuer zu spielen.) Es ist auch normal, All-Caps für alles zu verwenden, was dem Präprozessor zugeführt wird, also ist 'GLOBALS_H' in Ordnung. –

+0

@Karl: Danke für die Rückmeldung, das ist nützlich. –

3

Die Fehler sagen, ein struct source mehr als einmal definiert wurde.

Vielleicht haben Sie die Header-Datei zweimal eingefügt?

einfach auf der sicheren Seite zu sein, sicher sein, dass Ihre Header nur einmal bekommen enthalten: put

#ifndef YOUR_HEADER_FILE_NAME 
#define YOUR_HEADER_FILE_NAME 

am Anfang, und

#endif 

am Ende Ihrer Header-Datei: Dadurch wird verhindert, dass es von einer Quelldatei doppelt oder mehrmals eingeschlossen wird.