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?
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.
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.
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.
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;
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.
Man kann diesen höheren Blödsinn noch fortsetzen. Der Typ ist ja
optional, fehlt er, gibt es int.
Das kommt aus der Historie von C, bei der Typnamen fast überall optional waren. void gab es anfangs nicht, und ohne Angabe wurde immer implizit int verwendet, z.B. auch beim Return-Typ von Funktionen. Und wo es heute den meisten gar nicht bewsusst ist: short und long sind eigentlich auch keine Typen, sondern nur Typ-Modifiers. Die Typen heißen eigentlich short int und long int.
Lustig ist auch, dass man das ganze Zeug auch wild durcheinander mischen kann. So geht z.B. auch:
Gerade wenn man mit Templates arbeitet finde ich es gut wenn man den Typ den man verwenden möchte einmal definieren kann und dann einen kompakten Ausdruck hat. Ansonsten dreht man da irgendwann durch wenn man das immer mit schleppen muss.
Da steckt eher der Wunsch hinter, mit der neuesten Version zu arbeiten und die neuesten Features auszuprobieren.
Einige neue Features kann man auch in meiner kleinen µC Welt einsetzen.
Using gehört (für mich) eindeutig dazu.
Nutze übrigens z.Zt. AVR-Gcc 15.2 C++23 mit einer eingeschränkten libstdc++ in der Arduino IDE. Der große Rest der AVR Arduino Welt dümpelt meist noch bei Gcc 7.3 und C++11
Das war anders gemeint.
Zwang typedef nutzen zu müssen weil der Compiler so alt ist das using schlicht nicht geht.
In einem Projekt habe ich den Fall dass erst vor 1 Jahr ein Update auf Cpp11 möglich war.
Wenn man dann Code über mehrere Projekte wiederverwenden möchte ist es schwierig/unmöglich zu neuem Syntax zu wechseln.
Die Deklaration von Typaliassen mit using ist allgemeiner, da sie auch
getemplatet werden kann. Beispiel:
#include <map>
template <typename T> using intmap = std::map<int, T>; // OK
template <typename T> typedef std::map<int, T> intmap; // Fehler
Wobei man dieses Feature ja eigentlich auch problemlos den typedefs hätte geben können.
... endlich mit vernünftiger Syntax versehen worden.
Die Syntax von typedef wurde in C ziemlich beknackt definiert, denn bei
typedef struct S {
struct S *next;
} S;
muss man drinnen den Struct-Namen nutzen, weil der Typ-Name noch nicht existiert.
... endlich mit vernünftiger Syntax versehen worden.
Die Syntax von typedef wurde in C ziemlich beknackt definiert, denn bei
typedef struct S {
struct S *next;
} S;
muss man drinnen den Struct-Namen nutzen, weil der Typ-Name noch nicht
existiert.
Das ist doch für C++ überhaupt nicht relevant, und in C gibt's kein using. Gut, man könnte zwar wohl schreiben:
1
usingS=structS
2
{
3
S*next;
4
};
Aber der using-Teil ist an der Stelle ziemlich sinnbefreit.
Erzeugt 'using' eigentlich einen neuen Typ? Z.B. wenn man irgendein template gebastelt hat und die implementierten Spezialisierungen davon in der .cpp verstecken will. Wenn dem so wäre, dann machts schon einen Unterschied und böte einen Vorteil, auf typedef zu verzichten. using könnte dann das Leben mit dem Linker einfacher machen.
Nein, using vergibt wie typedef nur einen neuen Namen. Wenn ich einen Typ A definiere und using B = A schreibe, dann sind A und B ein und derselbe Typ.
Z.B. wenn man irgendein template gebastelt hat und die implementierten
Spezialisierungen davon in der .cpp verstecken will.
Klingt als wäre das eher was für explizite Template-Instanziierung.
Wobei das wohl auf Sprachebene auf 100% das gleiche rauskommt und nicht unterschieden werden kann. Lediglich ein anderes Wording in der Spezifikation, mehr nicht. Wie ein Compiler das tatsächlich implementiert sieht man auf Sprachebene auch nicht.
Natürlich!
In dem Fall ist es völlig egal, ob typedef oder using.
Es ist eher eine Frage der Gewöhnung.
Wer aus der C Ecke kommt oder früh mit C++ angefangen hat, wird wohl zu typedef tendieren.
Wobei das wohl auf Sprachebene auf 100% das gleiche rauskommt und nicht
unterschieden werden kann. Lediglich ein anderes Wording in der
Spezifikation, mehr nicht. Wie ein Compiler das tatsächlich
implementiert sieht man auf Sprachebene auch nicht.
Ok, danke für die Antworten, typedef und using unterscheiden sich wohl also nicht wirklich. Ich hab mir aufbauend auf Eure Ideen mal kurz einen Test gebaut, dabei hat der Compiler über Mehrfachdefinition der Spezialisierung gemeckert - würde er ja vermutlich nicht tun, wenn es ein anderer Typ wäre.
„There is no difference between a type alias declaration and typedef
declaration.“
type alias meint „using“.
Aber vielleicht schreibt ja noch mal jemand ein paar hundert Zeilen
Code, um das zu bestätigen.
Oliver
Es gibt keine Unterschiede in der Syntax.
Es gibt/gab aber kleine Unterschiede wo using/typedef erlaubt ist.
Das wurde mit C++23 behoben.
P2360R0 inconsistency between typedef declarations and alias declarations will have been removed.