标题time
中的time.h
函数由POSIX定义,以返回time_t
,显然,它可以是带符号的int或某种浮点数。
http://en.cppreference.com/w/c/chrono/time
但是,该函数在出错时返回(time_t)(-1)
。
在什么情况下time
失败?
基于签名,time_t time( time_t *arg )
似乎函数不应该分配,因此这可能导致失败的一个潜在原因。
time()
函数实际上由ISO定义,POSIX主要推迟,除非它可能对行为和/或属性(例如8位字节)进行进一步的限制。
并且,由于ISO C标准没有规定time()
如何失败(a),因此可能性列表不受任何限制:
可能性实际上是无限的,当然,我的意思是“字面上”在比喻意义而不是字面意义上:-)
如果POSIX检测到该值不适合time_t
变量,则POSIX本身会明确地调用它将失败:
如果出现以下情况,
time()
函数可能会失败:[EOVERFLOW]
自Epoch以来的秒数不适合time_t
类型的对象。
而且,就你的评论而言:
基于签名,
time_t time( time_t *arg )
,似乎函数不应该分配。
你需要对此保持谨慎。任何非标准规定的内容都完全可以解释。例如,我可以设想一个奇怪的实现,为NTP请求数据包分配空间到time.nist.somewhere.org
,以确保所有时间都是最新的,即使没有NTP客户端:-)
(a)实际上,它甚至没有指定time_t
的定义是什么,因此将它限制为整数或浮点值是不明智的,它可能是自大爆炸以来的四夜之数的字符串表示:-)所有它需要的是它可以被其他time.h
函数使用,并且它可以在失败时被转换为-1
。
POSIX确实声明它表示秒数(ISO没有),但没有对其进行任何其他限制。
我可以想象几个原因:
arg
不是空的,但指向一些非法的位置。某些实现可以检测非法指针(或捕获生成的SEGV)而不是崩溃,而是返回错误。