Manera portátil para tratar con 64/32 bit time_t
portability 32bit-64bit (3)
Creo que la única forma verdaderamente portátil es usar strftime
para convertir time_t
en una cadena.
Si está seguro de que solo está operando en plataformas donde time_t
es un int
, puede convertir a intmax_t
(desde stdint.h
) e imprimirlo utilizando PRIdMAX
(desde inttypes.h
).
Tengo un código que está construido tanto en Windows como en Linux. Linux en este punto siempre es de 32 bits, pero Windows es de 32 y de 64 bits. Windows quiere tener time_t be 64 bit y Linux aún lo tiene como 32 bit. Estoy de acuerdo con eso, excepto que en algunos lugares los valores de time_t se convierten en cadenas. Entonces, cuando time_T es de 32 bits, debe hacerse con% d y cuando es de 64 bits con% lld ... ¿cuál es la forma inteligente de hacerlo? Además: ¿Alguna idea de cómo puedo encontrar todos los lugares donde los time_t se pasan a las funciones de estilo printf para solucionar este problema?
edit: se me ocurrió declarar TT_FMT como "% d" o "% lld" y luego cambiar mis printfs como en printf ("time:% d, register: blah") para que se imprima ("time:" TT_FMT ", register : bla ") ¿Hay una mejor manera? ¿Y cómo los encuentro a todos?
Si quieres ir con el especificador de macro, te recomendaría un pequeño pellizco. En lugar de encapsular todo el especificador, encapsule solo el modificador:
#ifdef 64_BIT_TIME
#define TT_MOD "ll"
#else
#define TT_MOD ""
#endif
y luego usarlo así:
printf("current time in seconds is: %" TT_MOD "u", time(0));
La razón por la cual es que, mientras que principalmente quieres el segundo en decimal, es posible que de vez en cuando desees hex (o tal vez quieras marcar con 0). Al tener solo el modificador allí, puedes escribir fácilmente:
"%" TT_MOD "x" // in hex
"%08" TT_MOD "d" // left pad with 0''s so the number is at least 8 digits
Según el estándar C, time_t
es un tipo aritmético, "capaz de representar tiempos". Por lo tanto, podría ser el double
por ejemplo. (Posix lo menciona de manera más explícita y también garantiza que time()
devuelve el número de segundos desde la Época; este último no está garantizado por el estándar C).
Tal vez la solución más limpia es convertir el valor al tipo que desee. Es posible que desee uno de unsigned long long
o unsigned long
:
printf("%llu/n", (unsigned long long)t);