Получить максимальное значение для time_t с Visual Studio - PullRequest
5 голосов
/ 16 ноября 2011

Мне нужно, чтобы следующий код работал независимо от платформы:

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

Этот код отлично работает под всеми видами ОС Linux и Mac OS X.

К сожалению, в Windows это вернет -1, для tv.tv_sec.

Тогда я подумал о переопределении time_t следующим образом:

 typedef int time_t;

Это тоже не сработало, так как компилятор теперь жалуется:

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

Как я могу получить код, выполняемый этим кодом на платформно-независимой платформе?

Ответы [ 2 ]

12 голосов
/ 16 ноября 2011
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);
2 голосов
/ 16 ноября 2011

Вы не можете сделать это переносимо. time_t даже не обязательно является целочисленным типом. Это может быть структура или что-то еще.

Поскольку похоже, что вы устанавливаете член tv_sec для структуры timeval, почему бы вам просто не использовать правильный тип там? Это определяется как long int, поэтому вы должны сделать:

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 не является time_t, как предписывает POSIX, и поэтому приведение к long int возвращает вам отрицательное число.

Однако это можно исправить в Windows, определив _USE_32BIT_TIME_T. Это приведет к тому, что определение time_t будет соответствовать типу, используемому в timeval для tv_sec, и тогда ваш std::numeric_limits<time_t>::max() будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...