2017-03-03 93 views
2

我有一个time_t类型变量(从<time.h>),它存储失败的时间,并且想将它初始化为一个“null”值,该值为最终值if没有错误发生。有没有一种标准的方法将time_t变量设置为某种已知的空值?我发现如果发生错误,time()函数返回-1,也许这是最好的,但不知道我是否可以将一个整数值分配给typedef。也许我需要用这个......?如何在c中表示time_t类型的未初始化值

time_t failTime = (time_t)(-1);

+2

这里http://stackoverflow.com/questions/471248/what-is-ultimately-a-time-t-typedef-to接受的答案表示“ISO C time_t的定义为一个算术类型,但并未指定任何特定的类型,范围,分辨率或编码,也未指定应用于时间值的算术运算的含义。“所以它听起来像是不标准的,不管你的解决方案是什么。 –

+3

'time_t failTime = -1;'除非代码试图与'time_t'的其他负值一起工作 - 这很少见。 – chux

+0

我想没有理由来投射整数立即数 – robisrob

回答

4

如OP称为,从失败time()(和其它标准C库函数)的结果是(time_t)(-1),所以它是至少合理初始化time_t到“失败”值。

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

time_t真正类型和“整数和实浮点类型统称真正的类型”。 time_t可能是一个doublelong

严格地说time_t可以编码一个有效时间(time_t)(-1),但不是来自于各种功能的错误回报区分。

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

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

struct time_pedantic { 
    time_t t; 
    bool valid; 
} 
+1

十1 for更强大的解决方案。 –

3

如果你坚持的东西需要依赖于什么,但基本的C语言,你最好的办法是在你实际上并不需要代表过去远远选择一个时间,设置它在struct tm,并转换为time_tmktime。您可能必须循环并重试,直到找到可成功转换的值。典型的系统有一个以1970年为中心的大约+/- 68年的可表示时间范围,但你不一定假设你的确如此。

另一方面,如果您使用的是POSIX或POSIX类实现,则可以假设time_t是代表伪UTC的算术类型(更像UT1或称为“云 - UTC”)秒自1970年开始。然后,您可以在time_t类型的范围内选择一个较大的负整数值。