如何在 c 中表示 time_t 类型的未初始化值

How to represent uninitialized value for time_t type in c

我有一个 time_t 类型的变量(来自 <time.h>),它存储失败的时间,并想将它初始化为一个 "null" 值,这将是最终的没有错误发生时的值。是否有一种标准方法可以将 time_t 变量设置为某种已知的空值?我看到 time() 函数 returns -1 如果发生错误,也许这是最好的,但想知道我是否可以像那样将整数值分配给 typedef。也许我需要使用这个...?

time_t failTime = (time_t)(-1);

如果您需要的东西只依赖于基本的 C 语言,那么最好的选择是选择一个您实际上不需要表示的很久以前的时间,将其设置为struct tm,并用 mktime 转换为 time_t。您可能必须循环并重试,直到找到可以成功转换的值。典型系统的可表示时间范围约为 +/- 68 年,以 1970 年为中心,但您不一定能假设您的系统确实如此。

另一方面,如果您使用的是 POSIX 或 POSIX 类实现,您可以假设 time_t 是代表伪 UTC 的算术类型(更像是UT1 或 "cloud-UTC" 我称之为)自 1970 年初以来的秒数。然后您可以只选择 time_t 类型范围内的一个大负整数值。

正如 OP 所指,time()(和其他标准 C 库函数)失败的结果是 (time_t)(-1),因此它至少是 合理的 time_t 初始化为 "fail" 值。

// Just like OP
time_t failTime = (time_t)(-1);

time_treal 类型和 "integer and real floating types are collectively called real types" 。 time_t 可以是 doublelong

严格来说 time_t 可以将有效时间编码为 (time_t)(-1),但这与各种函数的错误 return 无法区分。

鉴于可能的编码范围很广,并考虑到自 1970 年 1 月 1 日以来使用整数秒的常见做法,(time_t)(-1) 是一个合理的选择。

更稳健(或迂腐的解决方案)会将标志与时间变量配对以指示其正确性。示例:

struct time_pedantic {
  time_t t;
  bool valid;
}