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?
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.
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?
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.
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
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
constintSBC_MODE_NORMAL=0x00;
2
constintSBC_MODE_SLEEP=0x00+1;
Mit automatisch hochzählender Initialisierung.
Natürlich könnte man auch #define verwenden
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.
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.
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?
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.
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.
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...
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.
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.
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;
(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.
;-)