gpt4 book ai didi

c - 为什么 `gmtime` 需要一个指针?

转载 作者:太空狗 更新时间:2023-10-29 16:28:50 24 4
gpt4 key购买 nike

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

现在他们决定让函数接受指向 time_t 的指针而不是直接传递 time_t 是有原因的吗?

据我所知,time_t 是算术类型,因此应该可以直接传递(而且我发现它适合 long).似乎还有对 NULL 指针的任何特定处理(这可能会激发传递指针)。

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

最佳答案

据我所知,这更像是一个历史怪癖。当 time.h 首次引入时,它的功能类似于 time ,它使用了一个无法返回的值(即:没有 long int 等)。该标准定义了一个晦涩的 time_t 类型,它仍然为供应商以奇怪的方式实现提供了很大的空间(它必须是算术类型,但例如没有定义范围或最大值)- C11 标准:

7.27.1 Components of time.
[...]
3 .The types declared are size_t (described in 7.19);
clock_t
and
time_t
which are real types capable of representing times;
4. The range and precision of times representable in clock_t and time_t are implementation-defined.

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);

两次设置相同的值并没有什么意义:一次通过返回它,一次使用间接寻址,但是参数在那里,因为最初,函数被定义为

time(time_t *t)

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

查看有关时间函数的 C11 标准,似乎函数行为的重点在于返回值。指针参数被简要提及,但它肯定没有任何意义:

7.27.2.4 The time function

1. Synopsis

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

2. Description

The time function determines the current calendar time. The encoding of the value is unspecified.

3. Returns

The time function returns the implementation’s best approximation to the current calendar time. The value (time_t)(-1) is returned if the calendar time is not available. If timer is not a null pointer, the return value is also assigned to the object it points to.

我们可以从中得出的主要结论是,就标准而言,指针只是获取函数返回值的次要方式。鉴于返回值表明出现了错误 ( (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

关于c - 为什么 `gmtime` 需要一个指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36837440/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com