Hallo
Ich habe bei einem STM32F4 C-Programm ein Problem.
In einem header file a.h ist folgendes definiert:
typedef enum
{
IDLE, INIT, START, RUN, STOP, BRAKE, WAIT, FAULT
} SystStatus_t;
Danach habe ich ein 2. Header File b.h
Darin ist a.h über #include "a.h" eingbebunden.
In diesem header File habe ich den Enum als extern eingebunden:
extern volatile SystStatus_t State;
Der Compiler zeigt mir aber aber die Stelle mit extern und meldet:
Error[Pe020]: identifier "SystStatus_t" is undefined
Was mache ich da falsch?
Danke & Gruss
>extern volatile SystStatus_t State;
Du kannst ein enum nicht dazu verwenden eine Variable zu
definieren.
holger schrieb: > Du kannst ein enum nicht dazu verwenden eine Variable zu > definieren. Sicher? Der gcc schluckt das.
Problem am obigen Code ist natürlich, daß die Variable nur extern deklariert wird, aber nie definiert. Was dann aber eine andere Meldung geben sollte...
holger schrieb: >>extern volatile SystStatus_t State; > > Du kannst ein enum nicht dazu verwenden eine Variable zu > definieren. Das ist keine Definition einer Variablen sondern ein Verweis dass irgendwo anders eine Variable definiert ist.
Mach Fax schrieb: > typedef enum > { > IDLE, INIT, START, RUN, STOP, BRAKE, WAIT, FAULT > } SystStatus_t; Allerdings ist es unglücklich auf diese Weise einen Datentyp zu definieren, da nicht offensichtlich ist welche Grösse er hat. Wird wohl jeder Compiler anders machen .....
Eberhard F. schrieb: > Allerdings ist es unglücklich auf diese Weise einen Datentyp > zu definieren, da nicht offensichtlich ist welche Grösse > er hat. Wird wohl jeder Compiler anders machen ..... Na und?
holger schrieb: > Du kannst ein enum nicht dazu verwenden eine Variable zu > definieren. Doch. Nur sollte man sie auch wirklich definieren, nicht nur deklarieren. Klaus Wachtler schrieb: > Was dann aber eine andere Meldung geben sollte... Bei dem betreffenden Compiler scheint das genau dafür zu stehen. Mach Fax schrieb: > extern volatile SystStatus_t State; Da fehlt in einem .c File noch: volatile SystStatus_t State;
Dann ist:
> identifier "SystStatus_t" is undefined
aber mehr als schräg.
SystStatus_t (als Typ) ist ja definiert, dagegen State nicht (als
Variable).
Deshalb frug ich auch nach mehr Quelltext, evtl. steht hier ja nur die
halbe Wahrheit.
Klaus Wachtler schrieb: > Deshalb frug ich auch nach mehr Quelltext, evtl. steht hier ja nur die > halbe Wahrheit. Hallo Es hat funktioniert. Der Fehler war, dass ich #include "a.h" einmal da gemacht habe wo ich es auch benötige und ein 2.Mal im global.h, das ebenfalls eingebunden wird. Demzufolge wurde #include "a.h" zweimal im gelichen File included und seit ich es im global.h entfernt habe ist auch der Fehler weg. Gruss & Danke der schnellen Antworten, übrigens, ich der Compiler ist IAR Workbench für ARM V7.30.
Trotzdem musst du noch irgenwo deine Variablen-Deklaration stehen haben. Die hast du uns bis jetzt unterschlagen.
Mach Fax schrieb: > Demzufolge wurde #include "a.h" zweimal im > gelichen File included und seit ich es im global.h entfernt habe ist > auch der Fehler weg. Der richtige/übliche Weg wäre, "include guards" zu verwenden, so in der Art:
1 | /* blabla.h was, wozu, weshalb, von wem, ... */ |
2 | |
3 | #ifndef _BLABLA_H_ |
4 | #define _BLABLA_H_ |
5 | |
6 | /* ... alles, was du in der blabla.h haben willst ... */ |
7 | |
8 | typedef ... |
9 | |
10 | extern ... |
11 | |
12 | |
13 | #endif |
Dann kannst du so oft includen wie du willst, ohne daß sich jemand daran stört. Nur Definition von Variablen und Funktionen (also ohne extern...) gehen so nicht, zumindest nicht wenn man mehrere C-Dateien hat und getrennt übersetzt. Aber sowas gehört ja auch nicht in eine Headerdatei (außer inline-Funktionen, die gehören dahin und funktionieren auch).
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.