uint128_t nennt keinen Typ

8

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?

    
Zimano 04.01.2016, 10:06
quelle

3 Antworten

11

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:

%Vor%

Alternativ können Sie __mode__(TI) :

verwenden %Vor%

Zitieren Sie die Dokumentation :

  

TImode

     

"Tetra Integer" (?) Modus stellt eine sechzehn-Byte-Ganzzahl dar.

Sechzehn Byte = 16 * CHAR_BIT & gt; = 128.

    
Andrea Corbellini 04.01.2016, 10:17
quelle
3
  

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 )

  
  1. Der typedef-Name uintN_t bezeichnet einen vorzeichenlosen Integer-Typ mit der Breite N und no   Füllbits. So bezeichnet uint24_t einen solchen vorzeichenlosen ganzzahligen Typ mit einer Breite von   genau 24 Bits.

  2.   
  3. 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.

  4.   

Also, hier bemerken wir zwei Dinge.

  1. Eine Implementierung ist nicht erforderlich, um die fixed-width int s zu unterstützen.

  2. 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.

Sourav Ghosh 04.01.2016 10:13
quelle
1

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

    
pqnet 04.01.2016 10:23
quelle

Tags und Links