c++ - sirve - ¿Debo usar long long o int64_t para código portátil?
short c++ para que sirve (2)
¿La sugerencia general es utilizar
int64_t
en lugar delong long
, cuando la portabilidad es un objetivo importante?
Me sorprendería mucho si un compilador ofreciera int64_t
pero no long long
.
Si long long
está presente, debe tener al menos 64 bits, por lo que la conversión de (u)int64_t
a (unsigned) long long
conserva el valor.
Si necesita un tipo con exactamente 64 bits, use (u)int64_t
, si necesita al menos 64 bits, (unsigned) long long
está perfectamente bien, como sería (u)int_least64_t
.
Tengo una base de código de código abierto que está escrita tanto en C como en C ++. Estoy buscando un tipo de entero que garantice que tenga al menos 64 bits de ancho, que se puede compilar de manera confiable en la mayoría de los sistemas operativos OS X (Intel, 64 bits) y Linux con compiladores C y C ++ de código abierto, sin demasiado trabajo adicional en la parte del usuario final. Windows y el soporte al cliente de 32 bits no son importantes en este momento.
Hice algunas pruebas en OS X, y el último GCC que se envía con las herramientas de desarrollador no es compatible con el modo C + 11 (y por lo tanto no parece garantizar la disponibilidad de long long
). Clang tampoco es compatible con esto, aunque admite long long
si se habilita el modo C99, después de cierta versión.
¿La sugerencia general es utilizar int64_t
en lugar de long long
, cuando la portabilidad es un objetivo importante? Usar los especificadores de formato parece doloroso.
¿Puedo lanzar de manera confiable un int64_t
a long long
(y también al equivalente unsigned
con uint64_t
) para usarlo con funciones existentes y bibliotecas que toman long long
como parámetros? (Y de vuelta, por supuesto)
En ese estado de ánimo, si envío un código que requiera la funcionalidad de Clang y no en GCC, ¿reemplazará Clang a GCC como el compilador de elección en Linux? ¿Es ese compilador algo que puedo esperar, en su mayor parte, al ofrecer código fuente a los usuarios finales?
Básicamente, me gustaría pedir algunos consejos de otros desarrolladores que hayan usado ambos tipos de códigos C y C ++ portátiles, que podrían tener algunas sugerencias sobre cuál podría ser el mejor camino a largo plazo, dado el objetivo anterior en mente. .
Los tipos long long
y unsigned long long
son tipos estándar C y estándar C ++, cada uno con al menos 64 bits. Todos los compiladores de los que tengo constancia proporcionan estos tipos, excepto, posiblemente, cuando se encuentra en un modo en -pedantic
, pero en este caso int64_t
o uint64_t
tampoco estarán disponibles con los compiladores anteriores a C ++ 2011. En todos los sistemas <stdint.h>
está disponible, también. Es decir, que yo sepa, no importa mucho cómo deletree el tipo. El objetivo principal de <stdint.h>
es proporcionar la mejor coincidencia para un número específico de bits. Si necesita al menos 64 bits pero también quiere aprovechar la implementación int_least64_t
de dicho tipo, usaría int_least64_t
o uint_least64_t
desde <stdint.h>
o <cstdint>
(en el caso de este último, los nombres son definido en el espacio de nombres std
).