Frage

Im Gegensatz zu Java oder C #, primitiven Datentypen in C ++ können in der Größe variieren je nach Plattform. Zum Beispiel wird int nicht als 32-Bit-Integer garantiert. Verschiedene Compiler Umgebungen definieren Datentypen wie uint32 oder dword für diesen Zweck, aber es scheint für feste Größe Datentypen keine Standard-Include-Datei zu sein.

Was ist die empfohlene Methode maximale Portabilität zu erreichen?

War es hilfreich?

Lösung

Ich fand dieser Kopf besonders nützlich: BOOST cstdint

In der Regel besser als eigenes Rad zu erfinden (was die Wartung entsteht und Prüfung).

Andere Tipps

Erstellen Sie eine Headerdatei mit dem Namen types.h und definieren alle die mit fester Größe primitive Typen, die Sie brauchen (int32, uint32, uint8, etc.). Um mehrere Plattformen zu unterstützen, können Sie entweder #ifdef ist oder haben einen separaten Include-Verzeichnis für jede Plattform (include_x86, include_x86_64, include_sparc). Im letzteren Fall würden Sie für jede Plattform separate Build-Konfigurationen haben, die das Recht einschließen Verzeichnis in ihrem Include-Pfad haben würden. Das zweite Verfahren ist bevorzugt, nach dem "The C ++ Gotchas" von Stephen Dewhurst.

Nur Nebenbei bemerkt, wenn Sie binäre Daten zwischen verschiedenen Plattformen passieren planen, können Sie auch auf Sorgen über Byte-Reihenfolge haben.

Ein Teil des C99-Standard war eine stdint.h Header-Datei, diese Art von Informationen zu liefern. So definiert es einen Typ namens uint32_t. Leider unterstützen viele Compiler nicht stdint.h. Die beste Cross-Plattform-Implementierung ich von stdint.h gesehen habe, ist hier: http: // www. azillionmonkeys.com/qed/pstdint.h . Sie können zählen nur, dass in Ihrem Projekt.

Wenn Sie Boost verwenden, ich glaube, es gibt auch etwas, das entspricht die stdint-Header.

Definieren Sie einen Typ (z int32) in einer Header-Datei. Für jede Plattform eine andere #ifdef verwenden und stellen Sie sicher, dass IN32 eine 32-Bit-Integer ist. Überall in Ihrem Code verwenden int32 und stellen Sie sicher, dass, wenn Sie auf verschiedenen Plattformen kompilieren verwenden Sie das Recht definieren

Zwei Dinge:

Als erstes gibt es eine Header-Datei namens limits.h, die viele nützliche Plattform gibt genaue Informationen. Es gibt Maximal- und Minimalwerte für den int-Typen zum Beispiel. Daraus kann man ableiten, wie groß der int-Typ ist.

Sie können auch zu dem sizeof Operator zur Laufzeit für diese Zwecke verwendet werden.

Ich hoffe, das hilft. . .

K

Wenn der Name mit zwei Unterstrichen beginnt (__), ein Datentyp ist nicht-Standard.

__ int8 (unsigned __int8)

__ int16 (unsigned __int16)

__ int32 (unsigned __int32)

__ int64 (unsigned __int64)

Versuchen Sie verwenden boost / cstdint.hpp

Es gibt einen stdint.h Header von der Norm C99 definiert und (glaube ich) einig oder andere Variante von ISO C ++. Dies definiert nette Typen wie int16_t, uint64_t, etc ... die garantiert werden, eine bestimmte Größe und Darstellung haben. Leider Verfügbarkeit ist, es ist nicht gerade Standard (Microsoft insbesondere war hier ein Fuß dragger).

Die einfache Antwort ist, die auf jeder 32- oder 64-Bit-Byte-adressierbaren Architektur arbeitet Ich bin mir bewusst:

  • Alle char-Variablen sind 1 Byte
  • Alle Kurz Variablen sind 2 Bytes
  • Alle int Variablen sind 4 Byte
  • Sie KEINE "long" verwendet werden, die von unbestimmter Größe ist.
  • Alle bekannten Compiler mit Unterstützung für 64-Bit-Mathematik erlauben "long long" als native 64-Bit-Typ.

Bitte beachten Sie, dass einige 32-Bit-Compiler haben keine 64-Bit-Typ überhaupt, so mit langen lange werden Sie auf 64-Bit-Systeme und eine kleinere Menge von Compilern begrenzen (die gcc und MSVC umfasst, so dass die meisten Menschen gewonnen‘ t kümmern sich um dieses Problem).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top