Wie man weiß, ob __uint128_t definiert ist [duplicate]

Lesezeit: 2 Minuten

Benutzeravatar von David Ranieri
David Ranieri

Wir können den Präprozessor verwenden, um zu wissen, ob unsigned long long ist definiert:

#include <limits.h>

#ifndef ULLONG_MAX
typedef unsigned long t_mask; 
#else
typedef unsigned long long t_mask;
#endif

Aber wie kann man wissen, ob __uint128_t ist definiert?

Sie können Folgendes versuchen. Ich weiß nicht, wie zuverlässig das ist, aber es könnte der einfachste Weg sein.

#ifdef __SIZEOF_INT128__
    // do some fancy stuff here
#else
    // do some fallback stuff here
#endif

  • Dies macht der Linux-Kernel, siehe include/linux/math64.h.

    – Nick Desaulniers

    15. März 2019 um 21:43 Uhr

Ich habe mich noch nicht mit __uint128_t befasst, aber basierend auf der bestehenden Musterverwendung würde ich Folgendes erwarten.

#include <stdint.h>

#ifndef UINT128MAX
    #error "__uint128_t not defined"
#endif

Hoffe das hilft

  • Compiler (zB x86-64 gcc8.2) definieren dies nicht in stdint.h oder limits.h.

    – Peter Cordes

    21. Februar 2019 um 19:25 Uhr


Benutzeravatar von unwind
entspannen

Seit Die __uint128_t Typ ist eine GCC-Erweiterungist es wahrscheinlich das Richtige, nach einer bekanntermaßen guten Version von GCC zu suchen.

Siehe diese Seite für Informationen zu den Makros, die zur Versionsprüfung des GCC-Compilers verwendet werden.

  • Clang ist sich dessen bewusst, dass es GCC-Code unterstützt, daher würde ich zu Sparkys Lösung tendieren

    – Benutzer2913094

    19. März 2016 um 21:58 Uhr

  • Die gcc-Erweiterung ist __int128__int128_t/__uint128_t ist eine Intel ICC-Erweiterung, die später von den meisten anderen Compilern übernommen wurde.

    – Chris Dodd

    22. August 2018 um 16:46 Uhr

  • unsigned __int128 wird nur von gcc auf 64-Bit-Zielen unterstützt, daher ist eine Versionsprüfung unzureichend, es sei denn, Sie wissen, dass Sie immer nur für x86-64, AArch64, MIPS64 oder was auch immer kompilieren.

    – Peter Cordes

    21. Februar 2019 um 18:34 Uhr

Benutzeravatar von crashulator
Crashulator

Suchen Sie Ihr cc1 im Baum /usr/libexec/gcc und fragen Sie es ab:

$ strings /usr/libexec/gcc/x86_64-redhat-linux/4.6.3/cc1 | grep uint128_t
__uint128_t            (or not)

1437370cookie-checkWie man weiß, ob __uint128_t definiert ist [duplicate]

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

Privacy policy