Wenn Sie verwenden möchten , Qt , müssen Sie umarmen quint8
, quint16
und so weiter.
Wenn Sie verwenden möchten GLib , müssen Sie willkommen guint8
, guint16
und so weiter.
Auf Linux gibt es u32
, s16
und so weiter.
uC / OS definiert SINT32
, UINT16
und so weiter.
Und wenn Sie eine Kombination dieser Dinge verwenden müssen, sollten Sie besser auf Probleme vorbereitet sein. Da auf Ihrem Rechner u32
werden typedef
d über long
und quint32
wird typedef
d über int
und der Compiler wird sich beschweren .
Warum macht das jeder, wenn es das gibt <stdint.h>
? Ist das eine Art Tradition für Bibliotheken?
stdint.h
wurde erfunden.sizeof(int) * CHAR_BIT
(zum Beispiel) sagen und das benutzen? Wenn Ihrint
zu klein ist, um Ihren Bereich darzustellen (z. B. ein Array-Index), sollten Sie ihn mit ziemlicher Sicherheitint
sowieso nicht verwenden , sondern so etwassize_t
. Warum sollteint32
es mehr Sinn machen? Die einzige Zeit, in der eine feste Breite sinnvoll ist, ist für die Kommunikation zwischen Systemen (z. B. Datei- / Netzwerkformat) ...uint16_t
(oder vielleicht seinefast
oder eineleast
Variante). Mein Punkt ist: Diese Typen sind bequem zu verwenden und haben ihren Existenzgrund.size_t
und / oderuint64_t
.Antworten:
stdint.h
existierte nicht, als diese Bibliotheken entwickelt wurden. Also hat jede Bibliothek ihre eigenentypedef
s gemacht.quelle
Für die älteren Bibliotheken ist dies erforderlich, da der betreffende Header (
stdint.h
) nicht vorhanden war.Es gibt jedoch immer noch ein Problem: Diese Typen (
uint64_t
und andere) sind eine optionale Funktion im Standard. Eine konforme Implementierung wird daher möglicherweise nicht mitgeliefert - und zwingt die Bibliotheken daher, sie auch heute noch einzuschließen.quelle
uintN_t
Typen sind optional, aber dieuint_leastN_t
unduint_fastN_t
Typen nicht.stdint.h
ist wahrscheinlicher seit 1999. Es ist wahrscheinlicher, dass viele Anwendungen (effektiv Alias-) Typen definieren, um eine teilweise Unabhängigkeit von der zugrunde liegenden Maschinenarchitektur aufrechtzuerhalten.Sie geben Entwicklern die Gewissheit, dass die in ihrer Anwendung verwendeten Typen ihren projektspezifischen Verhaltensannahmen entsprechen, die möglicherweise weder dem Sprachstandard noch der Compiler-Implementierung entsprechen.
Die Praxis spiegelt sich in der objektorientierten Fassade wider und wird von Entwicklern, die ausnahmslos Wrapper-Klassen für alle importierten Bibliotheken schreiben, häufig missbraucht.
Wenn Complier viel weniger Standard waren und Maschinenarchitekturen von 16-Bit-, 18-Bit- bis 36-Bit- Mainframes mit Wortlänge variieren konnten, war dies eine viel größere Überlegung. In einer Welt, die auf eingebetteten 32-Bit-ARM-Systemen konvergiert, ist diese Praxis jetzt viel weniger relevant. Es bleibt ein Problem für Low-End-Mikrocontroller mit ungeraden Speicherkarten.
quelle
stdint.h
ist seit 1999 standardisiert, aber wie lange ist es in der Praxis verfügbar? Die Menschen ziehen ihre Füße hoch, um neue Standards umzusetzen und zu übernehmen, und während dieser langen Übergangszeit sind alte Methoden immer noch ein Muss.stdint.h
ist , dass auch auf Plattformen , auf denen beispielsweiselong
undint32_t
haben die gleiche Größe und Darstellung, es gibt keine Anforderung , dass ein Castingint32_t*
auflong*
einen Zeiger wird erhalten , die zuverlässig ein Zugriffint32_t
. Ich kann nicht glauben, dass die Autoren des Standards es für offensichtlich hielten, dass layoutkompatible Typen aliaskompatibel sein sollten, aber da sie sich nicht die Mühe machten, dies zu sagen, glauben die Autoren von gcc und IIRC clang, dass die Sprache verbessert werden würde, indem sie sogar Aliasing ignorieren in Fällen, in denen es offensichtlich ist.-fno-strict-alias
, der aber tatsächlich noch funktioniert. Selbst wenn keine Codebasis vorhanden wäre, könnte kein einziger Regelsatz das optimale Gleichgewicht zwischen Optimierung und Semantik für alle Anwendungen erzielen, da unterschiedliche Anwendungen unterschiedliche Anforderungen haben. Fügen Sie die vorhandene Codebasis hinzu, und die Notwendigkeit für verschiedene Modi sollte klar sein.Sie haben also die Möglichkeit, char in int zu tippen.
Ein "Coding Horror" erwähnte, dass der Header eines Unternehmens einen Punkt hatte, an dem ein Programmierer einen booleschen Wert wollte, und ein Zeichen der logische native Typ für den Job war, und schrieb dies
typedef bool char
. Später fand jemand eine ganze Zahl als die logischste Wahl und schriebtypedef bool int
. Das Ergebnis, das vor Unicode lag, war praktischtypedef char int
.Sehr viel vorausschauendes Denken und Vorwärtskompatibilität, denke ich.
quelle