【问题标题】:How to get rid of the warning with time.h in C++?如何摆脱 C++ 中 time.h 的警告?
【发布时间】:2009-09-27 02:40:00
【问题描述】:

当我使用它时

#include<time.h>
//...
int n = time(0);
//...

我收到关于将时间转换为 int 的警告。有没有办法消除这个警告?

【问题讨论】:

    标签: c++ warnings system-calls time.h


    【解决方案1】:

    Yes, change n to be a time_t。如果您在大多数/所有系统上查看 time.h 中的签名,您会发现这就是它返回的内容。

    #include<time.h>
    //...
    time_t n = time(0);
    //...
    

    请注意Arak 是正确的:使用 32 位 int 是一个问题,至少 due to the 2038 bug。但是,您应该考虑到对整数 n(而不是 time_t)进行任何类型的算术运算只会增加您的代码提前遇到该错误的可能性。

    PS:如果我没有在原始答案中说清楚,对编译器警告的最佳响应几乎总是解决您被警告的情况。例如,将较高精度的数据强制转换为较低精度的变量会丢失信息 - 编译器试图警告您,您可能刚刚创建了一个地雷错误,直到很久以后才会有人绊倒。

    【讨论】:

    • @AraK,看到你上面的评论,你对 2038 年提出了很好的观点。
    • 也许使用auto 会更好。
    【解决方案2】:

    时间返回time_t 而不是整数。最好使用该类型,因为它可能大于int。

    如果你确实需要int,那么就显式地进行类型转换,例如:

    int n = (int)time(0);
    

    【讨论】:

    • 如果你的程序要运行到 2038 年,你就有问题了 ;)
    • 虽然从技术上讲是该问题的正确答案。这不是一个好主意。最好将您的代码转换为使用 time_t
    • 这治疗的是症状而不是疾病。
    • 嘿,看看答案。我说“最好使用那种类型”。
    • 除了大小问题,POSIX 允许time_t 是浮点类型,而不是任何整数大小。
    【解决方案3】:

    我认为您正在使用 Visual C++。 time(0) 的返回类型是 64bit int,即使您正在为 32bit 平台编程,这与 g++ 不同。要删除警告,只需将 time(0) 分配给 64bit 变量即可。

    【讨论】:

      【解决方案4】:

      您可能希望使用 time_t 类型而不是 int。

      参见http://en.wikipedia.org/wiki/Time_t 的示例。

      【讨论】:

        【解决方案5】:

        原因是 time() 函数返回 time_t 时间,因此在这种情况下您可能需要对 int 或 uint 进行静态转换。这样写:

        time_t timer;
        int n = static_cast<int> (time(&timer)); // this will give you current time as an integer and it is same as time(NULL)
        

        【讨论】:

          猜你喜欢
          • 2010-10-23
          • 1970-01-01
          • 2017-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-21
          • 1970-01-01
          相关资源
          最近更新 更多