【问题标题】:How to correctly cast time_t to long int?如何正确地将 time_t 转换为 long int?
【发布时间】:2015-03-18 16:07:31
【问题描述】:

我仍在学习 C++ 中的类型转换,目前正在这样做

long int t = time(NULL);

我正在使用 VS2013 并注意到从 'time_t' 到 'long' 警告的转换,所以我想我会键入它的样子;

long int t = static_cast<long int> time(NULL);

然而这还不行,结合静态转换和 C 风格转换工作

long int t = static_cast<long int> (time(NULL));

我只是想知道是否有人可以帮助阐明这一点?

【问题讨论】:

  • 你想完成什么?
  • 这不是“结合静态转换和 C 风格转换”,它只是静态转换的正确语法,它的参数需要 ()
  • 谢谢,我完全错过了将静态转换值放在括号中的要求。我没有学到什么新东西。
  • 不仅将结果限制在 long 的范围内,这仍然(截至 2014 年)会给您留下许多年的未来日期,您可以转换为 unsigned char,将该时间间隔缩短为255 秒到 1970 年。
  • 啊谢谢,我没想到

标签: c++ casting


【解决方案1】:

time(NULL) 不是强制转换,而是返回time_t 的函数调用。由于time_tlong int 的类型不完全相同,因此您会看到警告。

此外,static_cast&lt;T&gt;(value) 需要括号,这就是您的第一个版本不起作用的原因。

【讨论】:

  • 谢谢,我错过了。尽可能标记为答案。
  • 它说我可以在两分钟内接受答案。两分钟后我会这样做。
【解决方案2】:

您的问题包含答案。您提供的代码中的static_cast 泛型方法将time_t 类型作为其输入,并将其转换为long int 作为其返回值。此代码不包含 C 风格的类型转换。

long int t = static_cast<long int> (time(NULL));

类型转换也应该起作用,因为time_t 是一种算术类型,C 转换运算符将执行提升为long int 类型。

long int t = (long int)time(NULL);

这个casting tutorial 可能对你来说很有趣。

【讨论】:

    【解决方案3】:

    time_t 值是自 1970 年 1 月 1 日开始以来的秒数。将其转换为 32 位 long 因此您将自己限制为表示时间值 before the year 2038 的值,大致如此。这不是一个好主意,它的坏处是你警告的原因。


    尝试的表达方式

    static_cast<long int> time(NULL)
    

    只是无效的语法。 static_cast 需要带括号的值。

    【讨论】:

    • 有没有与此相关的大/小端问题,需要使用ntohl 才能到处兼容?
    猜你喜欢
    • 2016-08-03
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多