In C ++ werden Ganzzahlen mit fester Breite als optional definiert , aber ich kann anscheinend nicht die empfohlene Methode finden, um zu überprüfen, ob sie tatsächlich definiert sind.
Was wäre eine tragbare Methode, um zu überprüfen, ob Ganzzahlen mit fester Breite verfügbar sind?
#if defined(INT8_MIN)
cpp
Datei kompilieren. Je nachdem, ob die Kompilierung fehlschlägt oder nicht, wird ein Makro festgelegt, das Sie definieren können.AC_TYPE_INT8_T
usw.Antworten:
Um festzustellen, ob ein Integer-Typ mit fester Breite bereitgestellt wird, können Sie überprüfen, ob eines der entsprechenden
[U]INT*_MAX
oder[U]INT*_MIN
Makros definiert ist.Gemäß 7.20 Integer-Typen
<stdint.h>
, Absatz 4 des C11-Standards (beachten Sie die fettgedruckten Teile):C ++ erbt die C-Implementierung über
<cstdint>
. Siehe<cstdint>
vs<stdint.h>
für einige Details. Siehe auch Was tun__STDC_LIMIT_MACROS
und__STDC_CONSTANT_MACROS
bedeuten? für Details zu__STDC_LIMIT_MACROS
.Also, wenn
int32_t
verfügbar,INT32_MAX
undINT32_MIN
muss#define
'd sein. Umgekehrt, wennint32_t
nicht verfügbar, dürfenINT32_MAX
undINT32_MIN
dürfen#define
'd.Beachten Sie jedoch, wie @NicolBolas in einer anderen Antwort angegeben hat , dass eine Überprüfung möglicherweise nicht erforderlich ist.
quelle
[U]INT*_C
denINT64_C
wird definiert, obint64_least_t
verfügbar ist, nicht wennint64_t
verfügbar ist. Siehe DokumentationIm Großen und Ganzen ... das tust du nicht.
Wenn Sie ganzzahlige Typen mit fester Größe verwenden müssen, bedeutet dies, dass diese Typen explizit ihre spezifische Größe haben müssen. Das heißt, Ihr Code ist nicht funktionsfähig, wenn Sie keine Ganzzahlen dieser Größen erhalten können. Sie sollten sie also einfach verwenden. Wenn jemand Ihren Code auf einem Compiler verwendet, dem diese Typen fehlen, wird Ihr Code nicht kompiliert. Was in Ordnung ist, weil Ihr Code nicht funktioniert hätte, wenn er kompiliert worden wäre.
Wenn Sie keine Ganzzahlen mit fester Größe benötigen, sondern diese nur aus einem anderen Grund möchten, verwenden Sie die
int_least_*
Typen. Wenn die Implementierung Ihnen genau diese Größe geben kann, haben dieleast_*
Typen diese Größe.quelle
uint8_t
), aber dieser Code musste irgendwie auf einer Plattform ausgeführt werden, auf der ein Byte nicht 8 Bit enthält (was neben der Verwendung von a alte C ++ - Implementierung, wäre der einzige Grund, warumuint8_t
nicht verfügbar wäre)? Das heißt, warum mussten Sie dies außerhalb der Abwärtskompatibilität tun?uint8_t
war viel klarer als der vorherige Ad-hoc-Ansatz (und oft gebrochen).O(1)
versusO(n)
Anstrengung. Gleicher Grund, warum Menschen zB verwendenuint16_t
. Sie fragen "Warum nicht uint32_t verwenden und es selbst umsetzen?", Worauf die Antwort offensichtlich sein sollte.uint16_t
. Mein Grund ist, dass ich mit einem Gerät / Format / etc kommuniziere, das erwartet, dass genau 16 Bit Daten als binäre, vorzeichenlose Ganzzahl unter Verwendung des Endians für meinen Computer formatiert werden, und wenn ich keinen Typ bekomme, der ist Genau das, dann ist es viel schwieriger, effektiv damit zu kommunizieren. Mein Programm (und die APIs, die ich damit verwende) können grundsätzlich nicht auf einem Computer funktionieren , der dies nicht bietet.