Способ вернуть ошибку с функцией time_t в C
В настоящее время я пишу функцию C, которая возвращает значение time_t, но мне нужно также управлять случаями ошибок (потому что эта функция также использует функции ввода-вывода). Правильно ли использовать (time_t) -1 в качестве индикатора ошибки?
4 ответа
С помощью (time_t)-1
уже используется time()
Функция сообщить о сбое, поэтому не кажется необоснованным выбором:
Текущее календарное время, закодированное как объект time_t в случае успеха, (time_t)(-1) в случае ошибки. Если аргумент не равен NULL, возвращаемое значение равно значению, сохраненному в объекте, на который указывает аргумент.
Однако, если для вызывающего абонента необходимо различать сбой, связанный со временем, или сбой, связанный с вводом-выводом (или конкретными сбоями ввода-вывода), вы можете рассмотреть возможность добавления аргумента типа состояния в вашу функцию, который можно использовать для получения дополнительной информации о сбое.
Функция времени сама возвращается (time_t) -1
по ошибке, поэтому с помощью (time_t) -1
должно работать просто отлично.
Да, 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
способен нести отрицательные значения.
Значение (time_t)-1
указывает на 1969-12-31T23:59:59+00:00, за секунду до (Unix) эпохи.
Он возвращается некоторыми стандартными функциями времени C, что создает неудобства, если вам, возможно, придется работать с историческими временами и вам необходимо различать фактическую ошибку и случайное появление секунды до эпохи. Вы бы лучше справились с (гипотетическими) значениями TIME_T_MAX или TIME_T_MIN - максимально или минимально возможным значением time_t
, (Но имейте в виду, что до верхнего предела 32-битной подписи осталось около 25 лет или около того time_t
происходит - в январе 2038 года.)