К сожалению, стандарт ISO C (в настоящее время C11) не предоставляет никакого способа получить максимальное значение time_t
. Таким образом, если вы не используете такие инструменты, как Autoconf для предоставления информации, нужно сделать некоторые предположения.
Предполагая, что time_t
является целочисленным типом без битов заполнения (что имеет место в настоящее время на большинстве платформ, если не на всех), можно, вероятно, принять:
(((time_t) 1 << (sizeof(time_t) * CHAR_BIT - 2)) - 1) * 2 + 1
, которое является максимальным представимым значением для целочисленного типа со знаком (но тот факт, что значение представимо в time_t
, не означает, что оно поддерживается системой как time_t
значение).
Можно также определить, является ли time_t
целочисленным типом. Стандарт ISO C определяет, что time_t
является действительным типом (пункт 7.27.1). По определению, вещественный тип - это либо целочисленный тип, либо действительный плавающий тип (float
, double
или long double
, и, возможно, другие, добавленные в будущих версиях стандарт, как указано в пункте 6.11.1). Таким образом, если time_t
не является целочисленным типом, это обязательно реальный плавающий тип. Как следствие, можно определить, является ли time_t
целочисленным типом, с помощью теста (time_t) 1 / 2 == 0
.
Примечание: Стандарт C строго не требует, чтобы (T) 1 / 2
отличался от 0, если T
является плавающим типом, но если это не так, я подозреваю, что такие платформы будут иметь серьезные проблемы с плавающей точкой расчеты.