【发布时间】:2009-09-27 02:40:00
【问题描述】:
当我使用它时
#include<time.h>
//...
int n = time(0);
//...
我收到关于将时间转换为 int 的警告。有没有办法消除这个警告?
【问题讨论】:
标签: c++ warnings system-calls time.h
当我使用它时
#include<time.h>
//...
int n = time(0);
//...
我收到关于将时间转换为 int 的警告。有没有办法消除这个警告?
【问题讨论】:
标签: c++ warnings system-calls time.h
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:如果我没有在原始答案中说清楚,对编译器警告的最佳响应几乎总是解决您被警告的情况。例如,将较高精度的数据强制转换为较低精度的变量会丢失信息 - 编译器试图警告您,您可能刚刚创建了一个地雷错误,直到很久以后才会有人绊倒。
【讨论】:
auto 会更好。
时间返回time_t 而不是整数。最好使用该类型,因为它可能大于int。
如果你确实需要int,那么就显式地进行类型转换,例如:
int n = (int)time(0);
【讨论】:
time_t 是浮点类型,而不是任何整数大小。
我认为您正在使用 Visual C++。 time(0) 的返回类型是 64bit int,即使您正在为 32bit 平台编程,这与 g++ 不同。要删除警告,只需将 time(0) 分配给 64bit 变量即可。
【讨论】:
您可能希望使用 time_t 类型而不是 int。
【讨论】:
原因是 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)
【讨论】: