20 Stimmen

Ganze Zahlen mit fester Breite in C++

Gelegentlich muss ich Ganzzahlen mit fester Breite für die Kommunikation mit externen Geräten wie SPSen verwenden. Ich verwende sie auch, um Bitmasken zu definieren und Bitmanipulationen an Bilddaten durchzuführen. AFAIK der C99-Standard definiert feste Breite Ganzzahlen wie int16_t. Der von mir verwendete Compiler, VC++ 2008, unterstützt C99 jedoch nicht, und Microsoft plant meines Wissens auch nicht, ihn zu unterstützen.

Meine Frage ist, was ist die beste Praxis für die Verwendung von Fixed-Width-Ganzzahlen in C++?

Ich weiß, dass VC++ Nicht-Standard-Ganzzahlen mit fester Breite wie __int16 definiert, aber ich zögere, einen Nicht-Standard-Typ zu verwenden. Wird der nächste C++-Standard Ganzzahlen mit fester Breite definieren?

19voto

mmx Punkte 400975

Sie können das Problem mit folgenden Maßnahmen umgehen #ifdef Richtlinien.

#ifdef _MSC_VER
   typedef __int16 int16_t
#else
   #include <stdint.h>
#endif

13voto

Hrvoje Prgeša Punkte 2031

Boost hat die Typendefinitionen für alle C99-Typen und mehr: "Boost Ganzzahlige Bibliothek"

7voto

Adam Rosenfield Punkte 373807

Fügen Sie die Datei <stdint.h> um die Definitionen für Typen wie uint16_t . VC++ kommt nicht mit <stdint.h> standardmäßig, aber Sie können diese Datei von verschiedenen Stellen erhalten. Wikipedia listet ein paar auf, und Google findet viele weitere.

4voto

Konrad Rudolph Punkte 503837

Wird der nächste C++-Standard ganze Zahlen mit fester Breite definieren?

Ja.

Wie Mehrdad sagte, können Sie #ifdefs für jetzt. Eine Alternative wäre ein ausgeklügelter Vorlagenzauber. Boost hat etwas in dieser Richtung, die Boost Integer-Bibliothek .

1voto

Michael Burr Punkte 320591

Ich habe eine gemeinfreie (nicht GPL - echte gemeinfreie) Version von stdint.h von Danny Smith, das im mingw-Paket enthalten ist:

Ich musste diese Version so anpassen, dass sie mit einigen Nicht-VC-8-Compilern (hauptsächlich VC6) kompiliert werden konnte - sie hat mir gute Dienste geleistet.

Vielleicht komme ich eines Tages dazu, meine VC6-kompatible Version irgendwo zu veröffentlichen. Die Änderungen waren ziemlich geringfügig - nur einige Makro-Tricks, um VC6-spezifische Schlüsselwörter für 64-Bit-Typen zu verwenden. Wenn Sie keine VC6-Unterstützung benötigen, sollte die mingw-Version wahrscheinlich alles sein, was Sie brauchen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X