Cómo saber si __uint128_t está definido [duplicate]

2 minutos de lectura

Avatar de usuario de David Ranieri
david ranieri

Podemos usar el preprocesador para saber si unsigned long long se define:

#include <limits.h>

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

Pero como saber si __uint128_t ¿se define?

Puedes intentar lo siguiente. No sé qué tan confiable es esto, pero podría ser la forma más fácil.

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

  • Esto es lo que hace el kernel de Linux, consulte include/linux/math64.h.

    – Nick Desaulniers

    15 de marzo de 2019 a las 21:43

Todavía no he tratado con __uint128_t, pero según el uso del patrón existente, esperaría lo siguiente.

#include <stdint.h>

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

Espero que esto ayude

  • Los compiladores (por ejemplo, x86-64 gcc8.2) no definen esto en stdint.h oLIMITS.h.

    – Peter Cordes

    21 de febrero de 2019 a las 19:25


avatar de usuario de unwind
relajarse

Ya que la __uint128_t el tipo es una extensión GCClo correcto es probablemente buscar alguna versión conocida de GCC.

ver esta página para obtener información sobre las macros utilizadas para verificar la versión del compilador GCC.

  • Clang lo sabe para admitir el código GCC, por lo que me inclinaría por la solución de Sparky.

    – usuario2913094

    19/03/2016 a las 21:58

  • La extensión gcc es __int128__int128_t/__uint128_t es una extensión ICC de Intel que más tarde recogieron la mayoría de los demás compiladores.

    – Chris Dodd

    22 de agosto de 2018 a las 16:46

  • unsigned __int128 gcc solo es compatible con objetivos de 64 bits, por lo que una verificación de versión es insuficiente a menos que sepa que solo está compilando para x86-64, AArch64, MIPS64 o lo que sea.

    – Peter Cordes

    21 de febrero de 2019 a las 18:34

avatar de usuario de crashulator
colisionador

encuentre su cc1 en el árbol /usr/libexec/gcc, luego interroguelo:

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

¿Ha sido útil esta solución?