Tengo una base de código de código abierto que está escrita tanto en C como en C++. Estoy buscando un tipo entero que garantice que sea al menos de 64 bits de ancho, que se puede compilar confiablemente 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.¿Debo usar long long o int64_t para código portable?
Hice algunas pruebas en OS X, y el último GCC que se incluye 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 el modo C99 está habilitado, después de cierta versión.
¿Es la sugerencia general de utilizar int64_t
en lugar de long long
, cuando la portabilidad es un objetivo importante? Usar los especificadores de formato parece doloroso.
¿Puedo fiable emitir un int64_t
a long long
(y del mismo modo a la unsigned
equivalente con uint64_t
) para utilizarlo con las funciones y bibliotecas existentes que toman como parámetros long long
? (Y viceversa, por supuesto)
En ese estado de ánimo, si envío un código que requiera la funcionalidad de Clang y no en GCC, ¿Clang va a reemplazar 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 han utilizado 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 por encima del objetivo en mente.
gcc ha tenido 'long' larga como una extensión antes de C++ 11, así que mientras no desactivar gcc-extensiones que debe estar bien con el uso de' larga long' en gcc (En realidad no creo He utilizado/visto un compilador que no ofrece mucho tiempo por mucho tiempo). – Grizzly
Tenga en cuenta que 'int64_t' puede tener el tipo subyacente' long' o 'long long' entre otros, lo que puede causar problemas de portabilidad si se necesita una sobrecarga. –
Considere también typedef para realizar cambios sencillos de una plataforma a otra. – imallett