使用 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<std::time_t>::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<time_t>::max()
将起作用。
【讨论】:
这可以通过 C++11 的 decltype 便携完成,参见 ronag 的回答 根据标准 time_t 必须是算术类型,因此它不能是结构并且 numeric_limits 应该适用于任何有效类型。以上是关于使用 Visual Studio 获取 time_t 的最大值的主要内容,如果未能解决你的问题,请参考以下文章
如何以不同的名称保存 Visual Studio 项目(如另存为)?
Just-In-Time Debugging in Visual Studio 禁止VS在服务器上调试
在 Visual Studio 中使用 __LINE__ 宏作为模板参数