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
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
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)