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

sky*_*ing 19 c time posix

根据文档,struct tm *gmtime(const time_t *timer);应该将time_t指向转换timer为分解时间.

现在有没有理由为什么他们决定让函数取指针time_t而不是time_t直接传递?

据我所知,它time_t是算术类型,因此应该可以直接传递(我也觉得它适合于a long).此外,似乎有任何特定的NULL指针处理(这可能有动机传递指针).

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

Eli*_*gem 13

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

7.27.1时间的组成部分.
[...]
3.宣布的类型size_t(见7.19);
clock_t

time_t
其能够表示时间的实数类型;
4.可表示的时间范围和精度,clock_t并且time_t是实现定义的.

size_t在C11中描述为"是sizeof运算符的结果的无符号整数类型";

鉴于此,你的评论("我认为它适合于long"合理的")是可以理解的,但它是不正确的,或者至少是不准确的.例如,POSIX需要time_t是整数实数浮点类型.一个long符合这种描述,但long double也适用于一个long.更准确的假设是最小尺寸time_t是32位int(至少到2038),但time_t最好是64位类型.

无论如何,在那些日子里,如果一个值无法返回,唯一的选择是将内存传递给函数(这是一件明智的事情).
这就是为什么我们有这样的功能

time_t time(time_t *t);
Run Code Online (Sandbox Code Playgroud)

设置两次相同的值没有意义:一次返回它,一次使用间接,但参数是因为最初,该函数被定义为

time(time_t *t)
Run Code Online (Sandbox Code Playgroud)

注意缺少一个返回类型,如果time今天被添加,它要么被定义为void time( time_t * ),要么委员会没有喝酒,并意识到在这里传递指针的荒谬,他们将其定义为time_t time ( void );

看看关于时间函数的C11标准,似乎函数行为的重点在于返回值.指针参数简要提到但它当然没有任何意义:

7.27.2.4时间函数

1.概要

#include <time.h>
time_t time(time_t *timer);

2.描述

时间函数确定当前日历时间.未指定值的编码.

3.退货

time函数返回实现对当前日历时间的最佳近似值.time_t如果日历时间不可用,则返回值()( - 1).如果timer不是空指针,则返回值也会分配给它指向的对象.

我们可以从中得到的主要是,就标准而言,指针只是获得函数返回值的第二种方式.鉴于返回值表明出现了问题((time_t)(-1)),我认为我们应该将此函数看作是故意的time_t time( void ).

但是因为旧的实现仍在继续,并且我们已经习惯了它,它是应该被标记为弃用的那些东西之一,但是因为它从未真实,它可能将成为C语言的一部分永远...

函数time_t像this(const)一样使用的唯一其他原因是历史的,或者在API中维护一致的time.hAPI.AFAIK即是

TL; DR

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


我知道我之前读过关于time函数早期的那些东西,这是一个相关的SO答案

  • @trojanfoe所以说"出于历史和向后兼容的原因".有关详细信息,请参见http://www.catb.org/esr/time-programming/. (3认同)

Pau*_*vie 0

原因可能是在过去,参数不能大于整数,因此您不能传递 long 值,而必须将其作为指针传递。函数的定义从未改变。