【问题标题】:Get maximum value for time_t with Visual Studio使用 Visual Studio 获取 time_t 的最大值
【发布时间】: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:因为他希望能够在任何平台上编译。

标签: c++ visual-studio visual-c++


【解决方案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 应该适用于任何有效类型。
猜你喜欢
  • 2011-08-02
  • 2017-09-26
  • 2012-07-29
  • 2011-09-19
  • 1970-01-01
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多