Was ist der beste Weg, um einen Integer-Typ zu deklarieren, der auf allen Plattformen immer 4 Byte beträgt? Ich mache mir keine Sorgen um bestimmte Geräte oder alte Maschinen mit 16-Bit int
.
c
portability
ZZ Coder
quelle
quelle
Antworten:
#include <stdint.h> int32_t my_32bit_int;
quelle
<inttypes.h>
explizit so dokumentiert ist, dass er den Header enthält<stdint.h>
(dies ist bei C-Headern nicht üblich).<inttypes.h>
Der Header ist jedoch möglicherweise verfügbar, wenn dies<stdint.h>
nicht der Fall ist, und ist möglicherweise eine bessere Wahl für die Portabilität. Der<stdint.h>
Header ist eine Erfindung des Normungsausschusses und wurde so erstellt, dass freistehende Implementierungen von C (im Gegensatz zu gehosteten Implementierungen - normale) nur<stdint.h>
"und nicht unbedingt auch" unterstützen müssen<inttypes.h>
(dies würde auch bedeuten) Unterstützung '<stdio.h>
', was sonst nicht notwendig ist).uint32_t
.C kümmert sich nicht sehr um die exakten Größen von Ganzzahltypen. C99 führt den Header stdint.h ein , der wahrscheinlich die beste Wahl ist. Schließen Sie das ein und Sie können z
int32_t
. Natürlich unterstützen dies möglicherweise nicht alle Plattformen.quelle
Coreys Antwort ist meiner Meinung nach richtig für "best", aber ein einfaches "int" funktioniert auch in der Praxis (vorausgesetzt, Sie ignorieren Systeme mit 16-Bit-int). Zu diesem Zeitpunkt hängt so viel Code davon ab, dass int 32-Bit ist, dass Systemanbieter ihn nicht ändern werden.
(Siehe auch, warum long auf vielen 64-Bit-Systemen 32-Bit ist und warum wir "long long" haben.)
Einer der Vorteile der Verwendung von int32_t ist jedoch, dass Sie dieses Problem nicht aufrechterhalten!
quelle
Sie könnten eine Kopie von Brian Gladman suchen,
brg_types.h
wenn Sie keine habenstdint.h
.brg_types.h
Ermittelt die Größe der verschiedenen Ganzzahlen auf Ihrer Plattform und erstellt Typedefs für die gängigen Größen: 8, 16, 32 und 64 Bit.quelle
Sie müssen einschließen,
inttypes.h
anstatt,stdint.h
weilstdint.h
es auf einigen Plattformen wie Solaris nicht verfügbar ist und auf Systemen wie Linux für Sieinttypes.h
einschließtstdint.h
. Wenn Sie einschließen,inttypes.h
ist Ihr Code zwischen Linux und Solaris portabler.Dieser Link erklärt, was ich sage: HP Link zu inttypes.h
Und dieser Link enthält eine Tabelle, die zeigt, warum Sie nicht verwenden möchten
long
oderint
ob Sie beabsichtigen, dass eine bestimmte Anzahl von Bits in Ihrem Datentyp vorhanden ist. IBM Link zu tragbaren Datentypenquelle
Wenn stdint.h für Ihr System nicht verfügbar ist, erstellen Sie Ihre eigene. Ich habe immer eine Datei namens "types.h", die typedefs für alle vorzeichenbehafteten / vorzeichenlosen 8-, 16- und 32-Bit-Werte enthält.
quelle
Abhängig von Ihren Zielplattformen können Sie auch Autotools für Ihr Build-System verwenden
Es wird angezeigt, ob stdint.h / inttypes.h vorhanden ist und ob keine geeigneten typedefs in einer "config.h" erstellt werden.
quelle
stdint.h ist die offensichtliche Wahl, aber nicht unbedingt verfügbar.
Wenn Sie eine tragbare Bibliothek verwenden, sind möglicherweise bereits tragbare Ganzzahlen mit fester Breite verfügbar. Zum Beispiel hat SDL
Sint32
(S steht für "signiert") und GLib hatgint32
.quelle
C99 oder höher
Verwenden Sie
<stdint.h>
.Wenn Ihre Implementierung 2-Komplement-32-Bit-Ganzzahlen unterstützt, muss sie definiert werden
int32_t
.Wenn nicht, ist das nächstbeste
int_least32_t
ein ganzzahliger Typ, der von der Implementierung unterstützt wird und unabhängig von der Darstellung (Zweierkomplement, Einerkomplement usw.) mindestens 32 Bit beträgt.Es gibt auch
int_fast32_t
einen Integer-Typ mit einer Breite von mindestens 32 Bit, der mit der Absicht ausgewählt wurde, die schnellsten Operationen für diese Größenanforderung zu ermöglichen.ANSI C.
Sie können verwenden
long
, die aufgrund der im Standard festgelegten Mindestbereichsanforderungen garantiert eine Breite von mindestens 32 Bit hat.Wenn Sie lieber den kleinsten Ganzzahltyp verwenden möchten, um eine 32-Bit-Zahl anzupassen, können Sie Präprozessoranweisungen wie die folgenden mit den in definierten Makros verwenden
<limits.h>
:#define TARGET_MAX 2147483647L #if SCHAR_MAX >= TARGET_MAX typedef signed char int32; #elif SHORT_MAX >= TARGET_MAX typedef short int32; #elif INT_MAX >= TARGET_MAX typedef int int32; #else typedef long int32; #endif #undef TARGET_MAX
quelle