портативный способ иметь дело с 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 ("время: %d, регистр: вздор"), чтобы быть printf ("время: "TT_FMT", регистр: вздор"), там лучший путь? И как я нахожу их всех?

16
задан MK. 18 March 2010 в 03:39
поделиться

3 ответа

Согласно стандарту C, time_t - это арифметический тип, «способный представлять время». Так, например, это может быть double . (Posix упоминает об этом более явно , а также гарантирует, что time () возвращает количество секунд с начала эпохи - последнее не гарантируется стандартом C.)

Может быть. Самое чистое решение - преобразовать значение в любой желаемый тип. Вам может понадобиться один из unsigned long long или unsigned long :

printf("%llu\n", (unsigned long long)t);
11
ответ дан 30 November 2019 в 22:10
поделиться

Если вы хотите использовать спецификатор макроса, я бы порекомендовал одну небольшую настройку. Вместо того, чтобы инкапсулировать весь спецификатор, инкапсулируйте только модификатор:

#ifdef 64_BIT_TIME
  #define TT_MOD "ll"
#else
  #define TT_MOD ""
#endif

, а затем используйте его следующим образом:

printf("current time in seconds is: %" TT_MOD "u", time(0));

Причина в том, что, хотя вам в первую очередь нужна вторая десятичная дробь, время от времени вам может понадобиться шестнадцатеричный (или, возможно, вы хочу ведущие нули). Имея только модификатор, вы можете легко написать:

"%" TT_MOD "x"   // in hex
"%08" TT_MOD "d"  // left pad with 0's so the number is at least 8 digits
3
ответ дан 30 November 2019 в 22:10
поделиться

Я думаю, что единственный по-настоящему портативный способ — использовать strftime для преобразования time_t в строку.

Если вы уверены, что работаете только на платформах, где time_t является int, вы можете перейти на intmax_t (из stdint.h) и распечатать его с помощью PRIdMAX (из inttypes.h).

7
ответ дан 30 November 2019 в 22:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: