Переносной способ обработки 64/32 бит time_t
У меня есть код, который построен как на Windows, так и на Linux. Linux на данный момент всегда 32 бит, но Windows 32 и 64 бит. Windows хочет, чтобы time_t был 64 бит, а Linux все еще имеет 32 бит. Я в порядке, но в некоторых местах значения time_t преобразуются в строки. Поэтому, когда time_T равно 32 бит, это должно быть сделано с% d, а когда оно 64 бит с% lld... что это за умный способ сделать это? Кроме того: любые идеи, как я могу найти все места, где time_t передаются функции printf для решения этой проблемы?
изменить:
Я придумал объявление TT_FMT как "% d" или "% lld", а затем изменил мои printfs, как в
printf ( "time:% d, register: blah" ) для printf ( "time:" TT_FMT ", register: blah" )
Есть ли способ лучше? И как их найти?
Ответы
Ответ 1
Согласно стандарту C, time_t
является арифметическим типом, "способным представлять времена". Таким образом, это может быть, например, double
. (Posix упоминает это более явно, а также гарантирует, что time()
возвращает количество секунд с момента Epoch — последнее не гарантируется C стандарт.)
Возможно, самым чистым решением является преобразование значения в любой тип, который вы хотите. Вам может понадобиться один из unsigned long long
или unsigned long
:
printf("%llu\n", (unsigned long long)t);
Ответ 2
Я думаю, что единственный действительно переносимый способ - использовать strftime
для преобразования time_t
в строку.
Если вы уверены, что работаете только на платформах, где time_t
является int
, вы можете использовать intmax_t
(от stdint.h
) и печатать его с помощью PRIdMAX
(от inttypes.h
).
Ответ 3
Если вы хотите пойти со спецификатором макроса, я бы порекомендовал одну небольшую настройку. Вместо инкапсуляции всего спецификатора инкапсулируйте только модификатор:
#ifdef 64_BIT_TIME
#define TT_MOD "ll"
#else
#define TT_MOD ""
#endif
а затем используя его следующим образом:
printf("current time in seconds is: %" TT_MOD "u", time(0));
Причина в том, что, в то время как вы в первую очередь хотите, чтобы вторая была десятичной, каждый так часто может понадобиться hex (или, возможно, вы хотите, чтобы ведущие 0). Имея только модификатор, вы можете легко написать:
"%" TT_MOD "x" // in hex
"%08" TT_MOD "d" // left pad with 0 so the number is at least 8 digits