Способ вернуть ошибку с помощью функции time_t в C

В настоящее время я пишу функцию C, которая возвращает значение time_t, но мне также нужно обрабатывать случаи ошибок (поскольку эта функция использует функции ввода-вывода). Правильно ли использовать (time_t) -1 в качестве индикатора ошибки?


person Guid    schedule 12.10.2012    source источник
comment
Это то, что делает time(), так что это не должно быть слишком неправильно.   -  person Daniel Fischer    schedule 12.10.2012


Ответы (4)


Использование (time_t)-1 уже используется функцией time() для сообщения об ошибке, поэтому это не кажется необоснованный выбор:

Текущее календарное время, закодированное как объект time_t в случае успеха, (time_t)(-1) в случае ошибки. Если аргумент не равен NULL, возвращаемое значение равно значению, хранящемуся в объекте, на который указывает аргумент.

Однако, если вызывающей стороне необходимо различать сбой, связанный со временем, или сбой, связанный с вводом-выводом (или конкретные сбои ввода-вывода), вы можете рассмотреть возможность добавления в функцию аргумента типа состояния, который можно использовать для возврата дополнительной информации об ошибке.

person hmjd    schedule 12.10.2012

Сама функция time возвращает (time_t) -1 при ошибке, поэтому использование (time_t) -1 должно работать нормально.

person Josh Kelley    schedule 12.10.2012

Да, time_t подписано.

Так что совершенно нормально заставить функцию возвращать -1, чтобы указать на ошибку.

В любом случае, вы должны убедиться, что из логики вашего API вам никогда не нужно возвращать отрицательную разницу во времени, поскольку time_t является signed, чтобы иметь возможность выражать (также?) различия.

Обновление:

Это гарантируется только в системах POSIX. Даже там signed вводит в заблуждение, поскольку http://pubs.opengroup.org/onlinepubs/009696699/basedefs/sys/types.h.html определяет time_t как тип int или с плавающей запятой.

Таким образом, в системах, соответствующих стандарту POSIX, time_t может принимать отрицательные значения.

person alk    schedule 12.10.2012
comment
Номинально вы используете функцию difftime() для вычисления разницы между двумя значениями time_t; он возвращает double. На практике этим мало кто заморачивается. - person Jonathan Leffler; 12.10.2012
comment
Ты прав. Мое утверждение относится только к системам POSIX. Другие системы могут реализовать time_t любым другим способом. @ДжонатанЛеффлер - person alk; 12.10.2012
comment
time_t не обязательно является целым числом со знаком. См. стандарт C. - person Alexey Frunze; 13.10.2012

Значение (time_t)-1 указывает на 1969-12-31T23:59:59+00:00, за секунду до эпохи (Unix).

Его возвращают некоторые стандартные функции времени C, что доставляет неудобства, если вам может понадобиться работать с историческим временем и различать фактическую ошибку и случайное появление секунды перед Эпохой. Лучше использовать (гипотетические) значения TIME_T_MAX или TIME_T_MIN — максимальное или минимальное возможное значение time_t. (Но имейте в виду, что осталось всего 25 лет или около того, прежде чем наступит верхний предел для 32-битного time_t со знаком — в январе 2038 года.)

person Jonathan Leffler    schedule 12.10.2012