Forum: Mikrocontroller und Digitale Elektronik typedef enum


von Mach F. (machfax)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

Bitte ein komplettes Beispiel...

von holger (Gast)


Lesenswert?

>extern volatile SystStatus_t State;

Du kannst ein enum nicht dazu verwenden eine Variable zu
definieren.

von Klaus W. (mfgkw)


Lesenswert?

holger schrieb:
> Du kannst ein enum nicht dazu verwenden eine Variable zu
> definieren.

Sicher?

Der gcc schluckt das.

von Klaus W. (mfgkw)


Lesenswert?

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...

von Loocee L. (loocee)


Lesenswert?

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.

von Loocee L. (loocee)


Lesenswert?

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 .....

von (prx) A. K. (prx)


Lesenswert?

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?

von (prx) A. K. (prx)


Lesenswert?

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;

von Klaus W. (mfgkw)


Lesenswert?

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.

von Mach F. (machfax)


Lesenswert?

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.

von Loocee L. (loocee)


Lesenswert?

Trotzdem musst du noch irgenwo deine Variablen-Deklaration
stehen haben. Die hast du uns bis jetzt unterschlagen.

von Klaus W. (mfgkw)


Lesenswert?

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
Noch kein Account? Hier anmelden.