使用 Visual Studio 获取 time_t 的最大值

Posted

技术标签:

【中文标题】使用 Visual Studio 获取 time_t 的最大值【英文标题】:Get maximum value for time_t with Visual Studio 【发布时间】:2011-11-16 18:53:23 【问题描述】:

我需要让以下代码独立于工作平台:

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

此代码在各种 Linux OS 和 Mac OS X 下都能正常运行。

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

我当时想像这样重新定义 time_t:

 typedef int time_t;

这也不起作用,因为编译器现在抱怨:

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

我怎样才能得到这个代码在平台上独立运行的代码?

【问题讨论】:

tv.tv_sec的类型是什么?要么不是 time_t,要么你的 C++ 标准库由于某种原因没有正确编译。 tv 是 time.h 中定义的时间值。 tv_sec 在 winsok.h 中定义为 long。 @Joe Gauterin:因为他希望能够在任何平台上编译。 【参考方案1】:
tv.tv_sec = std::numeric_limits<decltype(tv.tv_sec)>::max();

不带 decltype 的替代方案

template<typename T> 
void set_max(T& val)val = std::numeric_limits<T>::max();

set_max(tv.tv_sec);

【讨论】:

很遗憾我不能使用c++11,但我会尝试第二个。【参考方案2】:

你不能便携地做到这一点。 time_t 甚至不一定是整数类型。它可能是一个结构或任何东西。

既然您正在设置 struct timeval 的 tv_sec 成员,为什么不直接使用正确的类型呢?这被定义为一个长整数,所以你应该这样做:

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

虽然,我现在注意到 POSIX 说 tv_sec 是 time_t,即使 MSDN 和 GNU libc 使用 long int。这些甚至无法区分持续时间和时间点的旧 API 肯定需要更换。如果您可以使用 C++11,请查看 std::chrono。

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

但是,这可以通过定义 _USE_32BIT_TIME_T 在 Windows 上解决。这将导致 time_t 的定义与 timeval 中用于 tv_sec 的类型匹配,然后您的 std::numeric_limits&lt;time_t&gt;::max() 将起作用。

【讨论】:

这可以通过 C++11 的 decltype 便携完成,参见 ronag 的回答 根据标准 time_t 必须是算术类型,因此它不能是结构并且 numeric_limits 应该适用于任何有效类型。

以上是关于使用 Visual Studio 获取 time_t 的最大值的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 Visual Studio C++ 工具集标签

如何以不同的名称保存 Visual Studio 项目(如另存为)?

Just-In-Time Debugging in Visual Studio 禁止VS在服务器上调试

在 Visual Studio 中使用 __LINE__ 宏作为模板参数

相当于 Visual Studio 中位集的 .Find_first 方法

visual studio .net的安装问题