【问题标题】:How to get the min/max value of time_t (if type is unknown)如何获取 time_t 的最小值/最大值(如果类型未知)
【发布时间】:2017-09-26 15:14:40
【问题描述】:

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

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 */

我联系了 antiword 作者,他建议我找到一种替代方法来导出 time_t 的最小值/最大值。

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

【问题讨论】:

  • 我不认为有一个通用的方法,因为标准没有指定关于底层类型的 anything。顺便说一句,有很多重复。
  • 天哪,这是一个旧软件!我隐约记得当时在 Linux 上运行它。看到 RISC OS 部分声明 Antiword“是 26/32 位中性”也很酷。 :) 我认为最好的办法是深入研究并找出为什么它想要在一段时间内获得最小值,也许可以重构它。
  • 您想要time_t 数据类型的最小/最大可表示 值还是最小/最大有效 值?例如,time_t 可能是long,但任何小于 0 的值可能不对应于有效时间。 有效我的意思是可以从time()返回或与mktime()一起使用,等等。

标签: c c-preprocessor time-t


【解决方案1】:

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

#  define variable_min_value(_var)          \
    _Generic(_var,                  \
         char: CHAR_MIN,            \
         unsigned char: (unsigned char)0,   \
         signed char: SCHAR_MIN,        \
         signed short: SHRT_MIN,        \
         unsigned short: (unsigned short)0, \
         signed int: INT_MIN,           \
         unsigned int: 0u,          \
         signed long: LONG_MIN,         \
         unsigned long: 0ul,            \
         signed long long: LLONG_MIN,       \
         unsigned long long: 0ull)

#define TIME_T_MIN   (variable_min_value((time_t)0))

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

【讨论】:

  • 这很棒。请注意,欺骗建议提到它也可能是浮点数。
  • 建议扩展这个好的答案以包含 float, double, long double,因为 time_t 被指定为标量 - 它可能是 FP。编译器错误的default: 也可能有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
  • 2019-06-24
  • 2021-02-14
  • 2021-11-08
  • 1970-01-01
  • 2013-09-20
相关资源
最近更新 更多