У меня есть некоторый код, который создается и в 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", регистр: вздор"), там лучший путь? И как я нахожу их всех?
Согласно стандарту C, time_t
- это арифметический тип, «способный представлять время». Так, например, это может быть double
. (Posix упоминает об этом более явно , а также гарантирует, что time ()
возвращает количество секунд с начала эпохи - последнее не гарантируется стандартом C.)
Может быть. Самое чистое решение - преобразовать значение в любой желаемый тип. Вам может понадобиться один из unsigned long long
или unsigned long
:
printf("%llu\n", (unsigned long long)t);
Если вы хотите использовать спецификатор макроса, я бы порекомендовал одну небольшую настройку. Вместо того, чтобы инкапсулировать весь спецификатор, инкапсулируйте только модификатор:
#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
Я думаю, что единственный по-настоящему портативный способ — использовать strftime
для преобразования time_t
в строку.
Если вы уверены, что работаете только на платформах, где time_t
является int
, вы можете перейти на intmax_t
(из stdint.h
) и распечатать его с помощью PRIdMAX
(из inttypes.h
).