使用Visual Studio获取time_t的最大值

Get maximum value for time_t with Visual Studio

本文关键字:最大值 time Visual Studio 获取 使用      更新时间:2023-10-16

我需要获得独立于平台的以下代码:

 timeval tv;
 tv.tv_sec = std::numeric_limits<time_t>::max();

这段代码在各种Linux操作系统和Mac OS X下都能很好地工作。

不幸的是,在windows下,对于tv.tv_sec.,这将返回-1

我当时想把时间重新定义为:

 typedef int time_t;

这也没有起到作用,因为喜剧演员现在抱怨道:

error C2371: 'time_t' : redefinition; different basic types

我如何才能让代码独立于平台形式运行?

tv.tv_sec = std::numeric_limits<decltype(tv.tv_sec)>::max();

无下降型的替代方案

template<typename T> 
void set_max(T& val){val = std::numeric_limits<T>::max();}
set_max(tv.tv_sec);

您不能通过便携方式完成此操作。time_t甚至不一定是一个积分类型。它可以是一个结构或任何真正的东西

既然看起来像是在设置结构timeval的tv_sec成员,为什么不在那里使用正确的类型呢?这被定义为一个长int,所以你应该这样做:

tv.tv_sec = std::numeric_limits<long int>::max();

尽管如此,我现在注意到POSIX说tv_sec是一个time_t,尽管MSDN和GNU libc使用长int。这些甚至无法区分持续时间和时间点的旧时间API肯定应该被替换。如果您可以使用C++11,请查看std::chrono。

无论如何,即使在Windows上,std::numeric_limits<std::time_t>::max()实际上也会给出最大时间值。问题只是Window对timeval::tv_sec的定义不是POSIX所要求的time_t,因此转换为long int会得到负数。

但是,可以在Windows上通过定义_USE_32BIT_TIME_T来修复此问题。这将导致time_t的定义与tv_sec的timeval中使用的类型匹配,然后std::numeric_limits<time_t>::max()就会工作。