Forum: Mikrocontroller und Digitale Elektronik Typedef enum ohne Namen


von Chandler B. (chandler)


Lesenswert?

Hallo,
wenn ich mir für den TLE9471 dateien mit dem Wizard generieren lasse, 
bekomme ich in TLE94x1_DEFINES.h eine menge typedef enums, aber ohne 
Namen.
z.B.
1
typedef enum
2
{
3
    SBC_MODE_NORMAL                         = 0x00U,
4
    SBC_MODE_SLEEP,
5
    SBC_MODE_STOP,
6
    SBC_MODE_RESET
7
};

Dies gibt mir beim compilieren auch die Warnung:
"useless storage class specifier in empty declaration"

wie benutze ich solche sachen jetzt im Code? Einfach als uint16_t?
Also das würde gehen, aber ist das so der richtige weg?

: Bearbeitet durch User
von Oliver S. (oliverso)


Lesenswert?

Welche Programmiersprache der beiden wahrscheinlichsten Möglixhkeiten 
nutzt du denn?

Oliver

von Cyblord -. (cyblord)


Lesenswert?

Chandler B. schrieb:
> wie benutze ich solche sachen jetzt im Code? Einfach als uint16_t?
> Also das würde gehen, aber ist das so der richtige weg?

Ein typedef und enum ohne jeden Namen? Wüsste ich jetzt auch nicht wie 
man das benutzt. Wird sicher eine kranke Makro-Vergewaltigung geben bei 
der man das nutzen kann. Leute die normal im Kopf sind lassen die Finger 
von sowas.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Chandler B. schrieb:
> Einfach als uint16_t?

Der default Datentype für enum ist in, nicht uintxxxx.
Das dürfte auch in deinem C Buch so stehen.

Ist doch C, oder?

von Chandler B. (chandler)


Lesenswert?

Oliver S. schrieb:
> Welche Programmiersprache der beiden wahrscheinlichsten Möglixhkeiten
> nutzt du denn?
>
> Oliver

C

Cyblord -. schrieb:
> Ein typedef und enum ohne jeden Namen? Wüsste ich jetzt auch nicht wie
> man das benutzt. Wird sicher eine kranke Makro-Vergewaltigung geben bei
> der man das nutzen kann. Leute die normal im Kopf sind lassen die Finger
> von sowas.

Nun ja, das ist von Infineon automatisch generierter Code, den ich in 
mein Projekt einbinden kann, um mit dem TLE9471 zu arbeiten.

von Chandler B. (chandler)


Lesenswert?

Arduino F. schrieb:
> Der default Datentype für enum ist in, nicht uintxxxx.
> Das dürfte auch in deinem C Buch so stehen.

Ja, das denke ich mir auch, da ich ja eigentlich gar nicht weiß, wie 
groß der Datentyp wirklich ist.

Aber als irgendwas muss ich das ja benutzen können.

Arduino F. schrieb:
> Ist doch C, oder?

Ja, ist C

: Bearbeitet durch User
von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Cyblord -. schrieb:
> Wüsste ich jetzt auch nicht wie
> man das benutzt.

Gar nicht!

Es ist nicht mehr als eine Liste von Konstanten.
Eine einfachere Schreibweise von:
1
const int SBC_MODE_NORMAL = 0x00;
2
const int SBC_MODE_SLEEP = 0x00 +1;
Mit automatisch hochzählender Initialisierung.
Natürlich könnte man auch #define verwenden

von Cyblord -. (cyblord)


Lesenswert?

Chandler B. schrieb:

> Ja, das denke ich mir auch, da ich ja eigentlich gar nicht weiß, wie
> groß der Datentyp wirklich ist.

Doch weil ein enum immer ein int ist. Anders würde es bei einem struct 
aussehen.

> Aber als irgendwas muss ich das ja benutzen können.

Denke nicht. Wüsste nicht wie. Also nicht sinnvoll. Natürlich kann man 
das einfach als Konstanten nutzen. Ist aber hässlich und unnötig. Und in 
C IMO nicht erlaubt. In C++ vielleicht? Weiß ich nicht.

: Bearbeitet durch User
von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Cyblord -. schrieb:
> Ist aber hässlich und unnötig.

Der springende, nützliche, Punkt ist das automatische Hochzählen.
Manuelles hochzählen ist mühsam und Fehlerträchtig.

von Cyblord -. (cyblord)


Lesenswert?

Arduino F. schrieb:
> Cyblord -. schrieb:
>> Ist aber hässlich und unnötig.
>
> Der springende, nützliche, Punkt ist das automatische Hochzählen.
> Manuelles hochzählen ist mühsam und Fehlerträchtig.

Aber was hindert einen daran dafür ein gültiges enum mit Namen zu 
erzeugen?

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Cyblord -. schrieb:
> Aber was hindert einen daran dafür ein gültiges enum mit Namen zu
> erzeugen?

Wenn/Warum es der Codegenerator nicht tut?
KA, ist nicht meine Baustelle.

Vielleicht weniger Bezeichner im betreffenden Namensraum.
Also auch weniger Kollisionen mit fremden "Code Modulen"

Anonyme enum sind übrigens in C++ kein Problem, nur das typedef wird 
angemeckert, weil unnötig.

von Cyblord -. (cyblord)


Lesenswert?

Arduino F. schrieb:
> Anonyme enum sind übrigens in C++ kein Problem

Wundert mich kein bisschen.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

In C++ würde man das eher so, oder so ähnlich, schreiben:
1
enum class SBC_MODE : uint8_t
2
{
3
    NORMAL                         = 0x00U,
4
    SLEEP,
5
    STOP,
6
    RESET
7
};
8
9
void setup() 
10
{
11
  Serial.begin(9600);
12
13
  Serial.println(uint8_t(SBC_MODE::RESET));
14
}
15
16
void loop() 
17
{
18
19
}
Also mit Bezeichner, und strenger Typisierung.
Wobei die Strenge den Zugriff auf das Value etwas erschwert.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Arduino F. schrieb:
> Der springende, nützliche, Punkt ist

Die eigentliche Frage ist: Was soll das typedef?

Ein Typ wird ja nicht definiert, funktioniert also nur wegen irgendeiner 
komischen C/C++ Syntax-Regel.

von Cyblord -. (cyblord)


Lesenswert?

Johann L. schrieb:
> Arduino F. schrieb:
>> Der springende, nützliche, Punkt ist
>
> Die eigentliche Frage ist: Was soll das typedef?

Oh ja.

> Ein Typ wird ja nicht definiert, funktioniert also nur wegen irgendeiner
> komischen C/C++ Syntax-Regel.

Ganz ehrlich: Das Konstrukt sieht mir typisch "indisch" aus. Wenn ich 
wetten müsste woher der Code für diesen Generator stammt...

von (prx) A. K. (prx)


Lesenswert?

enum { A, B, C }; ergibt Sinn.

typedef enum { A, B, C }; ist syntaktisch zulässig und hat die gleiche 
Bedeutung, ist aber eher verwirrend als sinnvoll.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Johann L. schrieb:
> Ein Typ wird ja nicht definiert, funktioniert also nur wegen irgendeiner
> komischen C/C++ Syntax-Regel.

Syntaktisch ist das vergleichbar zu
  extern int;
oder auch nur
  int;
und zulässig, da eine Liste von Namen wie
  int a, b, c;
leer sein kann. Andernfalls wäre
  enum { A, B, C };
syntaktisch auch nicht zulässig.

Die Syntax von C ist nicht wirklich tief durchdacht.

: Bearbeitet durch User
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

(prx) A. K. schrieb:
> int;

Ah, jetzt.

von (prx) A. K. (prx)


Lesenswert?

Man kann diesen höheren Blödsinn noch fortsetzen. Der Typ ist ja 
optional, fehlt er, gibt es int. Weshalb sich
  extern int a;
zu
  extern a;
abkürzen lässt. Mit leerer Liste der Namen geht also auch
  extern;
Da typedef syntaktisch eine storage class wie extern ist, geht auch
  typedef;

: Bearbeitet durch User
von Yalu X. (yalu) (Moderator)


Lesenswert?

(prx) A. K. schrieb:
> Man kann diesen höheren Blödsinn noch fortsetzen. Der Typ ist ja
> optional, fehlt er, gibt es int. Weshalb sich
>   extern int a;
> zu
>   extern a;
> abkürzen lässt. Mit leerer Liste der Namen geht also auch
>   extern;
> Da typedef syntaktisch eine storage class wie extern ist, geht auch
>   typedef;

Auch das extern bzw. typedef kann man weglassen. Übrig bleibt ein extrem
ausdruckstarkes
1
;

Aber auch dieses kann weggelassen werden:

Ups =8-o

Leider versagt dann die C-Code-Formatierung der Forensoftware.

;-)

: Bearbeitet durch Moderator
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.