如何获取time_t的最小/最大值(如果类型未知)

时间:2017-04-28 13:21:21

标签: c c-preprocessor time-t

当我运行antiword实用程序时,UBSAN抱怨未定义的行为:

runtime error: left shift of 1 by 63 places cannot be represented in type 'time_t' (aka 'long')

错误由以下TIME_T_MINTIME_T_MAX的宏触发。

#if !defined(TIME_T_MIN)
#define TIME_T_MIN      ((time_t)0 < (time_t)-1 ?\
                (time_t)0 :\
                (time_t)1 << (sizeof(time_t) * CHAR_BIT - 1))
#endif /* TIMER_T_MIN */

#if !defined(TIME_T_MAX)
#if defined(__TURBOC__) /* Turbo C chokes on the subtraction below */
#define TIME_T_MAX      (LONG_MAX)
#else   /* All others */
#define TIME_T_MAX      (~(time_t)0 - TIME_T_MIN)
#endif /* __TURBOC__ */
#endif /* TIME_T_MAX */

我联系了反对词作者,他建议我找到另一种方法来推导time_t的最小/最大值。

如果您不确定基础类型是什么,那么计算time_t的最小/最大值的跨平台方法是什么?

1 个答案:

答案 0 :(得分:3)

C11的localhost宏允许返回整数类型的最小值/最大值:

_Generic

有关其他变体,请参阅this library