Подтвердить что ты не робот

Переносной способ обработки 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" ) Есть ли способ лучше? И как их найти?

4b9b3361

Ответ 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