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

标签 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 的最小/最大值的跨平台方法是什么?

最佳答案

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对于其他变体。

关于c - 如何获取 time_t 的最小/最大值(如果类型未知),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43681269/

相关文章:

c - 时间段错误(0);

c++ - 将 MYSQL 时间戳转换为 time_t

java - 矩阵 : get value from given matrix

C -\r 在带有 nanosleep() 的 printf() 中不起作用

c - 将参数传递给可变参数宏

c - 是否可以防止 C 中宏的重复、相同参数?

c - 当我尝试计算学生平均成绩时,程序停止工作

c - 使用指针变量 typedef

c++ - 命名包括 guard

C++时间和随机函数