C 为什么“gmtime”要带指针?
根据C 为什么“gmtime”要带指针?,c,time,posix,C,Time,Posix,根据struct tm*gmtime(const-time\u-t*timer)应将计时器指向的时间转换为故障时间 现在他们决定让函数取一个指向时间的指针,而不是直接传递时间,这有什么原因吗 据我所知,时间\u t是算术类型的,因此应该可以直接通过(我也认为它适合长的)。另外,似乎对NULL指针有任何特定的处理(这可能是传递指针的动机) 有什么我遗漏的吗?今天仍然相关的东西?原因可能是在过去,参数不能大于整数,因此不能传递long,而必须作为指针。函数的定义从未改变。就我所见,这更像是一个历史怪
struct tm*gmtime(const-time\u-t*timer)
应将计时器指向的时间转换为故障时间
现在他们决定让函数取一个指向时间的指针,而不是直接传递时间,这有什么原因吗
据我所知,时间\u t
是算术类型的,因此应该可以直接通过(我也认为它适合长的)。另外,似乎对NULL
指针有任何特定的处理(这可能是传递指针的动机)
有什么我遗漏的吗?今天仍然相关的东西?原因可能是在过去,参数不能大于整数,因此不能传递long,而必须作为指针。函数的定义从未改变。就我所见,这更像是一个历史怪癖。当time.h首次被引入时,它的函数类似于time
,它使用了一个无法返回的值(即:nolong int
等)。该标准定义了一种模糊的time\u t
类型,这仍然为供应商以奇怪的方式实施留下了很大的空间(必须是算术类型,但没有定义范围或最大值)-C11标准:
7.27.1时间的组成部分。
[…]
3.声明的类型为size\u t
(如7.19所述)
时钟
和
time\t
哪些是能够代表时间的真实类型
4.clock\u t
和time\u t
中可表示的时间范围和精度如下
实现定义
size\u t
在C11中描述为“是sizeof运算符结果的无符号整数类型
有鉴于此,您的评论(“我认为它适合长的”)是可以理解的,但它是不正确的,或者至少是不准确的。例如,POSIX要求time\t
为整数或实浮点类型。一个long
符合这种描述,但是一个long-double
也符合这种描述,它不适合long
。更准确的假设是time\u t
的最小大小为32位int(至少到2038年为止),但time\u t
最好为64位类型
无论如何,在那些日子里,如果无法返回值,唯一的选择就是将内存传递给函数(这是一件明智的事情)。
这就是为什么我们有这样的函数
time_t time(time_t *t);
设置同一个值两次是没有意义的:一次是通过返回它,一次是使用间接方式,但是参数在那里,因为最初,函数被定义为
time(time_t *t)
请注意,缺少返回类型,如果今天添加了time
,它将被定义为void time(time\u t*)
,或者如果委员会没有喝酒,并且意识到在这里传递指针的荒谬性,他们会将其定义为time\u t time(void)代码>
看看C11标准中关于时间函数的内容,似乎函数行为的重点在于返回值。指针参数被简要提及,但它肯定没有任何意义:
7.27.2.4时间函数
1.提要
#包括
time\t time(time\t*timer)代码>
2.描述
时间函数确定当前日历时间。值的编码是
未指明
3.退换商品
time函数返回实现对当前值的最佳近似值
日历时间。如果未指定日历时间,则返回值(时间)(-1)
可用。如果计时器不是空指针,则返回值也将分配给它所属的对象
指向
我们可以从中得到的主要信息是,就标准而言,指针只是获取函数返回值的第二种方式。考虑到返回值表示出现了问题((time\u t)(-1)
),我认为我们应该将此函数视为time\u t time(void)
但是因为旧的实现仍然在使用,我们都已经习惯了,它是应该被标记为不受欢迎的东西之一,但是因为它从来都不是,它可能会永远成为C语言的一部分
函数这样使用time\t
(const
)的另一个原因是历史原因,或者是为了在time.h
API中保持一致的API。好吧,就是这样
TL;博士
出于历史、兼容性和一致性原因,大多数time.h
函数使用指向time\t
类型的指针
我知道我以前读过关于time
函数早期的东西,我猜在某个时候,他们设想time\u t
可能是一个struct
,如果发生这种情况,我想有效地处理它。@Sean但问题仍然存在,为什么是指针?@Sean,这是UNIXv7的proto:struct tm*gmtime(tim)long*tim代码>。这里没有结构。通过指针引用的结构可以在保持向后兼容的同时进行扩展。@myaut看看UNIX v6-这里是gmtime(tim)int tim[]
(它返回一个指向9元素int数组的指针-有struct,但没有struct tm)time\u t
是一个整数。我认为这只是一个“错误”,因为没有充分的理由。@trojanfoe:标准中没有任何东西可以确保time\t
为整数。它是算术类型,但不是int(至少不需要:POSIX允许使用整数类型和浮点类型,前提是基础类型为32或32)