Frage

In C99, schließe ich stdint.h und das gibt mir UINT32_MAX sowie uint32_t. Doch in C ++ die UINT32_MAX wird definiert werden. Ich kann __STDC_LIMIT_MACROS definieren, bevor einschließlich stdint.h, aber das funktioniert nicht, wenn jemand meine Header wird auch nach bereits inklusive stdint.h selbst.

So in C ++, was der normale Weg ist in einem uint32_t den Maximalwert darstellbaren herauszufinden?

War es hilfreich?

Lösung

Nun, ich weiß nicht, über uint32_t aber für die Grundtypen (bool, char, signed char, unsigned char, wchar_t, short, unsigned short, int, unsigned int, long, unsigned long, float, double and long double) können Sie die numeric_limits Vorlagen über #include <limits> verwenden sollten.

cout << "Minimum value for int: " << numeric_limits<int>::min() << endl;
cout << "Maximum value for int: " << numeric_limits<int>::max() << endl;

Wenn uint32_t ein #define eines der oben ist als dieser Code sollte die Box funktioniert

    cout << "Maximum value for uint32_t: " << numeric_limits<uint32_t>::max() << endl;

Andere Tipps

std::numeric_limits<T>::max() definiert den Maximalwert für den Typ T.

Nun, uint32_t immer 32 Bit sein, und immer ohne Vorzeichen, so dass Sie sicher manuell definieren:

#define UINT32_MAX  (0xffffffff)

Sie können auch tun

#define UINT32_MAX  ((uint32_t)-1)

Sie können hier die #include um Probleme beseitigen, indem Sie Ihre Build-Prozess Änderung der __STDC_LIMIT_MACROS Symbol auf der Compiler-Befehlszeile zu definieren, statt:

cxx -D__STDC_LIMIT_MACROS ...

Natürlich würden Sie immer noch Probleme haben, wenn ein Header #undefs dieses Symbol.

Auch die Autoren der Standard-Bibliothek Implementierung, die Sie möglicherweise nicht verwenden für Benutzer gedacht haben, dass bestimmtes Symbol zu setzen; es könnte ein Compiler-Flag oder ein anderes Symbol sein, die Benutzer bestimmt sind, zu verwenden C99-Typen in C ++ zu ermöglichen.

Ich kann nicht sagen, so ist hier mein Eingang Glen vs Lior Kogan Antwort.

Wenn Sie statische Variablen verwenden, werden Sie in das Problem führen, dass, wenn Sie einen konstanten Wert innerhalb einer Klasse zu numeric_limits zuweisen :: max () wird dieser Wert in der Tat auf Null gesetzt wird, weil der Reihenfolge der Initialisierung (siehe diese Post Null Initialisierung und statische Initialisierung von lokalem Bereich statischer Variable )

Also in diesem Fall wird es nur funktionieren, indem Sie Lior Kogan Antwort.

// This looks cleaner, less error prone and easier to read than the other suggested by Lior Kogan
#define UINT32_MAX  ((uint32_t)-1)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top