Ich portiere Code von C nach C ++. Während der Konvertierung stieß ich auf:
uint128_t
nennt keinen Typ
Mein Compiler: gcc Version 5.2.1
Mein Betriebssystem: Ubuntu 15.1
Diese kompilierte Strafe wie C und ich dachten, dass es aufgelöst werden würde, indem stdint.h
eingeschlossen wird, aber das hat es nicht getan. Bisher habe ich nichts anderes probiert, da es anscheinend nicht viele Informationen zu diesem Fehler gibt ( Beispiel ). uint128_t
wird in diesem gesamten Programm verwendet und ist für den Build essentiell, daher kann ich es nicht entfernen, und ich bin mir nicht sicher, ob ich einen anderen Integer-Typ verwenden soll.
Im Folgenden finden Sie ein Beispiel dafür, wo und wie es verwendet wird.
%Vor% Wäre es in Ordnung, ein uint128_t
zu definieren oder sollte ich mir meinen Compiler ansehen?
GCC hat eine integrierte Unterstützung für die Typen __int128
, unsigned __int128
, __int128_t
und __uint128_t
(die letzten beiden sind nicht dokumentiert). Verwenden Sie sie, um Ihre eigenen Typen zu definieren:
Alternativ können Sie __mode__(TI)
:
Zitieren Sie die Dokumentation :
TImode
"Tetra Integer" (?) Modus stellt eine sechzehn-Byte-Ganzzahl dar.
Sechzehn Byte = 16 * CHAR_BIT & gt; = 128.
Ich dachte, das würde durch das Einfügen von
stdint.h
gelöst, aber nicht.
Nun, vielleicht nicht.
Überprüfen Sie zuerst den C ++ - Header, cstdint
, von C ++ 14, Kapitel § 18.4.1,
%Vor%
und
Der Header definiert alle Funktionen, Typen und Makros wie im Standard C 7.18. [..]
Dann zitieren Sie den C11
Standard, Kapitel §7.20.1.1 ( Hervorhebung meins )
Der typedef-Name
uintN_t
bezeichnet einen vorzeichenlosen Integer-Typ mit der BreiteN
und no Füllbits. So bezeichnetuint24_t
einen solchen vorzeichenlosen ganzzahligen Typ mit einer Breite von genau24
Bits.Diese Typen sind optional. Wenn jedoch eine Implementierung Integer-Typen mit bereitstellt Breiten von 8, 16, 32 oder 64 Bit, keine Füllbits und (für die Typen mit Vorzeichen), die a Zweierkomplement-Darstellung, es soll die entsprechenden typedef Namen definieren.
Also, hier bemerken wir zwei Dinge.
Eine Implementierung ist nicht erforderlich, um die fixed-width int
s zu unterstützen.
Standard begrenzt die Breite bis zu 64
, wie wir es sehen. eine größere Breite als das ist im Standard noch nicht vorgeschrieben. Sie müssen die Dokumentation der verwendeten Umgebung überprüfen.
Wie in anderen Antworten darauf hingewiesen, erfordert der C ++ - Standard keine 128-Bit-Ganzzahl, um verfügbar zu sein, und auch nicht typedef
ed als uint128_t
, auch wenn sie vorhanden ist. Wenn Ihr Compiler / Ihre Architektur keine 128-Bit-Ganzzahlen unterstützt und Sie sie benötigen, können Sie boost verwenden, um sie zu emulieren:
Ich denke, dass die Boost-Bibliothek automatisch den nativen Typ verwenden wird, falls verfügbar