time_t now = time(NULL)之间是否存在差异;和time_t现在;时间(安培;现在);?

时间:2017-03-14 13:07:24

标签: c time time.h time-t

两者都在我的简单测试代码中正常工作,但我想知道编码风格是否存在任何真正的差异或任何商定的偏好。

附上示例代码:

#include <stdio.h>
#include <time.h>

int main(int argc, char **argv)
{
    time_t now1, now2;
    time(&now1);
    now2 = time(NULL);

    printf("now1 = %ld\n", now1);
    printf("now2 = %ld\n", now2);

    return 0;
}

修改
我刚看到Keith Thompson's answer - 这个问题应该标记为重复。

4 个答案:

答案 0 :(得分:1)

两者之间没有区别。

如果你这样做:

time_t now1, now2;
now2 = time(&now1);

now1now2都具有相同的值。

作为历史记录,如果在Linux 2.4或更早版本的内核64位上运行,这些是相同的。 time函数中存在一个错误,其中只设置了传入参数的低32位(当time_t为64位时)。因此,如果您使用了返回值,那么您将获得正确的值,但如果您传入了time_t的地址,那么如果未初始化变量,您将获得垃圾。

答案 1 :(得分:1)

作为考虑性能的旁注:如果使用具有NULL参数值的那个,编译器将生成不同的代码(最可能是xor输出的参数(通常是寄存器))对于带参数的情况(其中生成的代码将包含对实际地址的输入参数的赋值),并且因为无论参数值如何,如果存在(有效)地址,函数将返回时间值作为参数,执行可能需要几个周期,因为在函数内部,检查是否将返回值复制到给定地址,以及是否存在地址(即:参数不为空)的内存复制将被执行。

答案 2 :(得分:1)

  

如果有任何真正的区别?

没有太大的区别。

time_t now1, now2;
time(&now1);
now2 = time(NULL);

未显示time_t now3 = time(NULL);遵循流行的RAII样式,因为在没有定义值的情况下,对象永远不会存在 - 这是OP的2个示例中的一个短缺。

  

或任何商定的编码风格偏好?

我更喜欢第三种方式,但最好使用您小组编码标准所列出的风格。如果您的团队缺乏标准,那么制作它们就像以类似的一致风格编码更有价值。

答案 3 :(得分:0)

没有区别。在过去,任何大于int的内容都不能作为函数返回返回,因此,接收变量必须作为指针传递。