【问题标题】:Why does `std::time` have an unnecessary parameter?为什么`std::time`有一个不必要的参数?
【发布时间】:2020-08-09 10:15:33
【问题描述】:

来自cppref

std::time_t time(std::time_t* arg);

返回编码为std::time_t对象的当前日历时间,并将其存储在对象中 由arg 指向,除非arg 是空指针。

我从未见过有人使用非空指针参数调用std::time。我只是想知道:

1.为什么std::time 有一个不必要的参数?

2。设计背后有什么动机/理由吗?

【问题讨论】:

  • 真正的动机可能已经失去了......历史。
  • 我对导致此的路径的猜测:从前可能有函数void time(time_t*)。然后有人认为返回值会更方便,并且由于将 void 返回值更改为非 void 不会破坏 ABI,但删除参数会,我们最终得到了time_t time(time_t*)。我不知道是不是这样,也不知道为什么函数最初只使用指针进行输出。
  • 请参阅this 重复的答案。
  • @eerorika 我不相信这是一个很好的副本。这个问题本身基本上是不相关的,其中一个答案恰好与这个问题的切线相吻合。
  • eerorika 的猜测大致正确,虽然历史遗物不是 void time(time_t*),因为在最初设计函数时,我们没有time_t,@ 987654334@, void 一起玩。请参阅下面的my answer,复制自其他问题以解决 Joseph Sible 的反对意见。

标签: c++ c time posix


【解决方案1】:

从历史上看,time_t 是一种抽象类型,并且可能期望它可能需要是一种可能无法可靠返回的结构或扩展类型,或者编译器在 ABI 中可能不同意返回它,例如通过将其存储到调用者提供的地址来返回它是“有意义的”。请注意 difftime 接口的存在以及 C 对如何解释 time_t 值的模糊性。只有 POSIX(很久以后)要求单位为秒(从纪元开始,并定义了纪元)。我不确定是否有任何具体证据证明这一点(可能在 C89 基本原理文档中?),但这是我要研究的领域。

对于 C++,很简单,std::time 接口就是 C 的 time 函数,包裹在 std:: 中。

【讨论】:

  • 我不会说“只有 POSIX(很久以后)要求单位为秒......并定义了时代”。从 1970 年以来,Unix 一直在使用 seconds-since-since-1970。X3J11 引入了所谓的抽象类型time_t,理论上可以以其他方式定义。于是 Posix 转身说它的 time_t 是 seconds-since-1970,就像它一直以来一样。是的,difftime 是同一抽象尝试的一部分,但在实践中,除了 Posix 之外的实现选择非常罕见。
【解决方案2】:

[此答案由very similar answer 改编为slightly different question。]

std::time() 有一个“额外参数”,因为它与 C 的 time() 函数相同,后者非常非常古老。它可以追溯到 C 的黎明,当时该语言甚至没有类型 long。曾几何时,获得类似 32 位类型的唯一方法是使用包含两个 ints 的数组——那时 ints 是 16 位。

所以你打电话

int now[2];
time(now);

time 将 32 位时间填充到 now[0]now[1] 中,一次 16 位。如果你想以人类可读的格式打印时间,你调用ctime(int *),它也接受时间作为指针,原因基本相同。

后来,dmr 完成了将long 添加到编译器,所以你可以开始说

long now;
time(&now);

大约在同一时间,有人意识到如果time() 继续返回值,现在它可以返回值,而不是仅仅通过指针填充它,这将是有用的。但是 - 向后兼容是一件很棒的事情 - 为了所有仍在执行 time(&now) 的代码的利益,time() 函数必须继续支持指针参数。这就是为什么——这也是为什么向后兼容并不总是那么美好的原因——毕竟——如果你使用返回值,你仍然必须将 NULL 作为指针传递:

long now = time(NULL);

再后来,我们开始多次使用time_t,而不是普通的long,例如,可以将其更改为64位类型,避开y2.038k problem

所以,总而言之,“额外参数”是一个历史遗迹,是在time() 无法简单地返回时间的时候遗留下来的,因为没有合适的返回类型。此外,额外的参数必须是一个指针,指向要填充的数据结构,因为该数据结构——数组——也不能简单地由函数返回。

【讨论】:

    猜你喜欢
    • 2022-10-13
    • 2017-06-11
    • 2021-11-23
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 2017-11-24
    • 2013-11-19
    • 2021-12-18
    相关资源
    最近更新 更多