据我所知,这更像是一个历史怪癖。当 time.h 第一次被引入时,它的功能类似于time,它使用了一个无法返回的值(即:没有long int 等)。该标准定义了一个不起眼的 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 的 long double 也适合。更准确的假设是 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 标准,似乎函数行为的重点在于返回值。简单地提到了指针参数,但它肯定没有任何意义:
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