impresión multiplataforma de enteros de 64 bits con printf

En Windows, es “% I64d”. En Linux y Solaris, es “% lld”.
Si quiero escribir printfs multiplataforma que imprime valores long long : ¿cuál es la mejor manera de hacerlo?

 long long ll; printf(???, ll); 

Hay un par de enfoques.

Podrías escribir tu código en la forma que corresponde a C99, y luego suministrar hacks específicos del sistema cuando los comstackdores-escritores te decepcionen. (Lamentablemente, eso es bastante común en C99).

 #include  #include  printf("My value is %10" PRId64 "\n", some_64_bit_expression); 

Si uno de sus sistemas de destino ha descuidado implementar o de alguna otra manera ha diabólicamente porque algunas de las características de tipo son opcionales, entonces solo necesita un #define específico del sistema para PRId64 (o lo que sea) en ese sistema.

El otro enfoque es seleccionar algo que actualmente se implementa siempre como 64 bits y es compatible con printf y luego se envía. No es perfecto, pero a menudo lo hará:

 printf("My value is %10lld\n", (long long)some_64_bit_expression); 

MSVC es compatible con Visual Studio 2005 .

Puede verificar el valor de la macro _MSC_VER ( >= 1400 para 2005) o simplemente no admite comstackdores anteriores.

No proporciona las macros C99, por lo que tendrá que lanzar long long más long long lugar de usar PRId64 .

Esto no ayudará si está usando librerías MSVC más antiguas con un comstackdor no MSVC (creo que mingw, al menos, proporciona su propia versión de printf que soporta ll )

No en linux y solaris, es solo por casualidad que esto es lld para un tipo de 64 bits. C99 prescribe macros simples (pero feos) para hacer estas cosas portátiles PRId64 . Dado que algunos comstackdores de Windows no siguen el estándar, es posible que no tenga suerte, lamentablemente.

Editar: en su ejemplo, está utilizando una cosa diferente a un entero de 64 bits, es decir, un long long . Esto bien podría ser 128 en algunas architectures. Aquí C99 tiene typedef s que le garantizan el ancho mínimo o exacto del tipo (si se implementan en la plataforma). Estos tipos se encuentran con el encabezado inttypes.h , concretamente int64_t para un tipo de 64 bits de ancho fijo representado en el complemento a dos. Tal vez o tal vez no su comstackdor de Windows tiene esto.

Como alternativa puedes usar un código como este:

 uint64_t currentTimeMs = ...; printf("currentTimeMs = 0x%08x%08x\n", (uint32_t)(currentTimeMs >> 32), (uint32_t)(currentTimeMs & 0xFFFFFFFF) ); 

O tal vez:

 printf("currentTimeMs = %u%09u\n", (uint32_t)(currentTimeMs / 1000000000), (uint32_t)(currentTimeMs % 1000000000) );