Sollte ich long long oder int64_t für portablen Code verwenden?

Lesezeit: 5 Minuten

Ich habe eine Open-Source-Codebasis, die sowohl in C als auch in C++ geschrieben ist. Ich suche nach einem Integer-Typ, der garantiert ist wenigstens 64 Bit breit, die auf den meisten OS X- (Intel, 64-Bit) und Linux-Boxen mit Open-Source-C- und C++-Compilern zuverlässig kompiliert werden können, ohne zu viel zusätzliche Arbeit auf Seiten des Endbenutzers. Die Unterstützung von Windows und 32-Bit-Clients ist derzeit nicht wichtig.

Ich habe einige Tests unter OS X durchgeführt, und der neueste GCC, der mit den Entwicklertools geliefert wird, unterstützt den C+11-Modus nicht (und scheint daher die Verfügbarkeit von long long). Clang unterstützt dies auch nicht, obwohl es unterstützt long long wenn der C99-Modus aktiviert ist, ab einer bestimmten Version.

Ist der allgemeine Vorschlag zu verwenden int64_t anstelle von long long, wenn Portabilität ein wichtiges Ziel ist? Die Verwendung der Formatbezeichner scheint schmerzhaft.

Kann ich zuverlässig an int64_t zu long long (und ebenso an die unsigned gleichwertig mit uint64_t), um es mit vorhandenen Funktionen und Bibliotheken zu verwenden, die dauern long long als Parameter? (Und natürlich wieder zurück.)

Wenn ich Code versende, der Clang-Funktionalität erfordert, die nicht in GCC enthalten ist, wird Clang GCC als Compiler der Wahl unter Linux ersetzen? Kann ich diesen Compiler größtenteils erwarten, wenn ich Endbenutzern Quellcode anbiete?

Grundsätzlich möchte ich andere Entwickler um Rat fragen, die beide Typen für portierbaren C- und C++-Code verwendet haben und vielleicht einige Vorschläge haben, was angesichts des oben genannten Ziels langfristig der bessere Weg sein könnte .

  • gcc hatte long long als Erweiterung vor c ++ 11, so lange Sie gcc-extensions nicht deaktivieren, sollten Sie mit der Verwendung zufrieden sein long long auf gcc (Eigentlich glaube ich nicht, dass ich einen Compiler verwendet/gesehen habe, der lange Zeit nicht lange angeboten hat).

    – Grizzly

    17. September 2012 um 23:09 Uhr


  • Beachten Sie, dass int64_t kann einen zugrunde liegenden Typ haben long oder long long Dies kann unter anderem zu Portabilitätsproblemen führen, wenn eine Überladung erforderlich ist.

    – Markus B

    17. September 2012 um 23:41 Uhr

  • Ziehen Sie auch typedef in Betracht, um einfache Änderungen von Plattform zu Plattform vorzunehmen.

    – imallett

    18. September 2012 um 5:48 Uhr

  • Eine zu berücksichtigende Sache ist die Verwendung von Überladungen oder Vorlagen mit int64_t möglicherweise verschiedene Versionen auf verschiedenen Systemen auswählen. Siehe diese andere Frage zu int64_t vs. long vs. long long

    – Bo Persson

    18. September 2012 um 9:00 Uhr

Die Typen long long und unsigned long long sind Standard-C- und Standard-C++-Typen mit jeweils mindestens 64 Bit. Alle mir bekannten Compiler stellen diese Typen bereit, außer möglicherweise in a -pedantic Modus, aber in diesem Fall int64_t oder uint64_t wird auch nicht mit Pre-C++ 2011-Compilern verfügbar sein. Auf allen Systemen <stdint.h> ist auch vorhanden. Das heißt, soweit ich das beurteilen kann, spielt es keine Rolle, wie Sie den Typ buchstabieren. Das Hauptziel von <stdint.h> besteht darin, die beste Übereinstimmung für eine bestimmte Anzahl von Bits bereitzustellen. Wenn Sie mindestens 64 Bit benötigen, aber auch die schnelle Implementierung eines solchen Typs nutzen möchten, würden Sie verwenden int_least64_t oder uint_least64_t aus <stdint.h> oder <cstdint> (Im letzteren Fall sind die Namen im Namensraum definiert std).

  • Ich würde mir sicher wünschen, dass der Standard einen größeren Typ wie 128 oder mehr hinzufügt, wenn man bedenkt, dass man heutzutage, wo Kryptografie viel verwendet wird, einen solchen Typ benötigt, damit man sich nicht auf viele Bibliotheken verlassen muss.

    – farmdve

    17. September 2012 um 23:26 Uhr

  • Ich habe keinen Vorschlag für einen solchen Typ gesehen (long long long?) obwohl mir bewusst ist, dass viele Systeme tatsächlich 128-Bit-Typen durch SIMD-Unterstützung unterstützen: Senden Sie einen Vorschlag an WG14 und/oder WG21!

    – Dietmar Kühl

    17. September 2012 um 23:29 Uhr

  • long long long ist nicht notwendig; ein System, das 128-Bit-Ganzzahlen unterstützt, definieren kann erweiterte Integer-Typen und definieren int128_t und uint128_t in Bezug auf diese Typen.

    – Keith Thompson

    18. September 2012 um 0:19 Uhr

  • wenn das OP den schnellsten Typ mit mindestens 64 Bit will, int_fast64_t und uint_fast64_t wird besser sein

    – phuklv

    11. März 2015 um 4:01 Uhr


Ist der allgemeine Vorschlag zu verwenden int64_t anstelle von long longwenn Portabilität ein wichtiges Ziel ist?

Ich wäre sehr überrascht, wenn ein Compiler angeboten würde int64_t aber nicht long long.

Wenn long long vorhanden ist, muss es mindestens 64 Bit haben, also Casting aus (u)int64_t zu (unsigned) long long ist werterhaltend.

Wenn Sie einen Typ mit benötigen exakt 64 Bit verwenden (u)int64_twenn Sie brauchen wenigstens 64 Bit, (unsigned) long long ist völlig in Ordnung, wie wäre (u)int_least64_t.

Verwenden Sie int64_t. int64_t bedeutet 64 Bit und Sie erhalten 64 Bit, wohin Sie auch gehen. long long ist eigentlich genauso implementierungsabhängig wie long. Das heißt, long long muss größer oder gleich long sein, aber das kann je nach Compiler und Plattform unterschiedlich sein.

  • Es gibt eine Garantie in den Standards, dass long long muss mindestens 64 Bit sein. Es kann länger sein, aber es kann nicht kürzer sein. Also, nein, es ist nicht so implementierungsabhängig wie long: Zum long die Regel ist, dass es nur so lange sein muss wie intdie nur größer als sein muss char. Sie könnten also eine Plattform mit haben sizeof(long) == 2aber sizeof(long long) >= 8 muss auf jeder Plattform wahr sein.

    – Cmaster – Wiedereinsetzung von Monica

    11. Mai 2020 um 15:10 Uhr


  • Vielen Dank. Das ist gut zu wissen. Aber zumindest ist die Größe von (long long) immer noch plattformabhängig und der einzige Weg, um konsistente 64-Bits zu erhalten, ist int64_t.

    – TJ Bandrowsky

    12. Mai 2020 um 14:42 Uhr

  • Ja, aber die Frage war “ein ganzzahliger Typ, der garantiert vorhanden ist am wenigsten 64 Bit breit”. Und genau das ist es long long liefert.

    – Cmaster – Wiedereinsetzung von Monica

    12. Mai 2020 um 15:08 Uhr

  • Das OP sprach von portabel, also würde ich mich für die feste Größe entscheiden: int64_t. Es sagt 64 Bit, also müssen Sie nicht einmal darüber nachdenken.

    – TJ Bandrowsky

    12. Mai 2020 um 15:52 Uhr

  • long long ist als Teil des Standards portabel. Und wenn Sie keine haben long longSie werden sehr wahrscheinlich keine haben int64_t entweder.

    – Cmaster – Wiedereinsetzung von Monica

    12. Mai 2020 um 16:19 Uhr

1401940cookie-checkSollte ich long long oder int64_t für portablen Code verwenden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy