Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么“gmtime”要带指针?_C_Time_Posix - Fatal编程技术网

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
,它使用了一个无法返回的值(即:no
long 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)