根据documentation,struct tm *gmtime(const time_t *timer);
应该将time_t
指向的timer
转换为细分时间。
现在有没有理由让他们决定让函数指向time_t
而不是直接传递time_t
?
据我所知,time_t
属于算术类型,因此应该可以直接传递(我也认为它适合于long
)。此外,似乎有NULL
指针的任何特定处理(这可能促使传递指针)。
有什么我想念的吗?今天还有什么相关的东西?
答案 0 :(得分:13)
从我所看到的,它更像是一个历史怪癖。当time.h首次引入时,它的函数如time
,它使用了一个无法返回的值(即:no long int
等)。该标准定义了一种模糊time_t
类型,仍然为供应商提供了很多空间以奇怪的方式实现(它必须是算术类型,但没有定义范围或最大值) - C11标准:< / p>
在C11中描述了7.27.1时间的组成部分 [...]
3,声明的类型为size_t
(在7.19中描述);
clock_t
和
time_t
这是能够代表时间的真实类型;
4.clock_t
和time_t
中可表示的时间范围和精度 实现定义的。
size_t
,因为&#34;是sizeof运算符的结果的无符号整数类型;&#34;
有鉴于此,您的评论(&#34;我发现它适合long
&#34; )是合理的,但它和#39;不正确,或者至少是不准确的。例如,POSIX要求time_t
为整数或实数浮动类型。 long
符合该描述,但long double
也不适合long
。更准确的假设是time_t
的最小大小是32位int(至少到2038),但time_t
最好是64位类型。
无论如何,在那些日子里,如果无法返回一个值,唯一的选择是将内存传递给函数(这是明智之举)。
这就是为什么我们有像
time_t time(time_t *t);
设置相同的值两次真的没有意义:一次通过返回它,一次使用间接,但参数是因为最初,该函数被定义为
time(time_t *t)
请注意,缺少退货类型,如果今天添加time
,则定义为void time( time_t * )
,或者委员会没有喝酒,并实现在这里传递指针的荒谬性,他们将其定义为time_t time ( void );
关于时间函数的C11标准,似乎强调功能&#39;行为是在返回值上。指针参数被简要提及,但它当然没有任何重要性:
7.27.2.4时间函数
1。概要
#include <time.h>
time_t time(time_t *timer);
2。描述
时间函数确定当前日历时间。值的编码是 未指定的。
3。返回
时间函数返回实现对电流的最佳近似值 日历时间。如果日历时间不是,则返回值(
time_t
)( - 1) 可用。如果timer不是空指针,则返回值也会分配给它 指向。
我们可以从中得到的主要是,就标准而言,指针只是获得函数返回值的第二种方式。鉴于返回值表明出现了问题((time_t)(-1)
),我认为我们应该将此函数视为time_t time( void )
。
但是因为旧的实施仍在继续,并且我们已经习惯了它,它应该被标记为弃用的东西之一,但因为它从未真正是的,它可能永远属于C语言的一部分......
函数使用time_t
这样的唯一原因(const
)是历史性的,或者是在time.h
API中维护一致的API。
由于历史,兼容性和一致性原因,大多数time.h
函数都使用指向time_t
类型的指针。
我知道我之前阅读time
函数早期的内容,here's a related SO answer
答案 1 :(得分:0)
原因可能是在过去,参数不能大于整数,所以你不能通过一个长期而不得不做一个指针。函数的定义从未改变过。