为什么`gmtime`会占用指针?

时间:2016-04-25 10:02:26

标签: c time posix

根据documentationstruct tm *gmtime(const time_t *timer);应该将time_t指向的timer转换为细分时间。

现在有没有理由让他们决定让函数指向time_t而不是直接传递time_t

据我所知,time_t属于算术类型,因此应该可以直接传递(我也认为它适合于long)。此外,似乎有NULL指针的任何特定处理(这可能促使传递指针)。

有什么我想念的吗?今天还有什么相关的东西?

2 个答案:

答案 0 :(得分:13)

从我所看到的,它更像是一个历史怪癖。当time.h首次引入时,它的函数如time,它使用了一个无法返回的值(即:no long int等)。该标准定义了一种模糊time_t类型,仍然为供应商提供了很多空间以奇怪的方式实现(它必须是算术类型,但没有定义范围或最大值) - C11标准:< / p>

  

7.27.1时间的组成部分   [...]
  3,声明的类型为size_t(在7.19中描述);
      clock_t
  和
  time_t
  这是能够代表时间的真实类型;
  4. clock_ttime_t中可表示的时间范围和精度   实现定义的。

在C11中描述了

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。

的AFAIK

TL; DR

由于历史,兼容性和一致性原因,大多数time.h函数都使用指向time_t类型的指针。

我知道我之前阅读time函数早期的内容,here's a related SO answer

答案 1 :(得分:0)

原因可能是在过去,参数不能大于整数,所以你不能通过一个长期而不得不做一个指针。函数的定义从未改变过。