Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Зачем функция time() C/C++ принимает аргумент?

#cpp #время


Как я прочитал на cppstudio, функция time() при передаче ей аргумента, не равного
NULL, возвращает то же значение, на которое указывает аргумент. 

Вопрос: в чём вообще смысл аргумента этой функции, если она, по сути, выполняет с
ним разыменование указателя? Я верю, что здесь есть скрытый смысл, но пока что мне
представляется, что лучше было бы сделать эту функцию не принимающей аргументов, чтобы
она просто возвращала значение текущего времени. Переубедите меня в том, что передавать
ей аргумент кроме NULL бесполезно (можно ведь просто разыменовать указатель с помощью *).
    


Ответы

Ответ 1



Как я прочитал на cppstudio, функция time() при передаче ей аргумента, не равного NULL, возвращает то же значение, на которое указывает аргумент. Она не возвращает то же значение. Ниже приведена POSIX-реализация функции time: time_t time (time_t *t) { struct timeval tv; time_t result; if (__gettimeofday (&tv, (struct timezone *) NULL)) result = (time_t) -1; else result = (time_t) tv.tv_sec; if (t != NULL) *t = result; return result; } Как видите, она не возвращает то же значение - она дублирует результат. Вопрос: в чём вообще смысл аргумента этой функции Возможно, в первых реализациях под Unix, эта функция возвращала X в случае успеха и errno в случае ошибки.

Ответ 2



Вероятнее всего потому что это функция из С, а в нём есть принцип возврата кода ошибки функции. В случае неудачи он вернёт -1, и если надо проверить, то просто сделать: time_t __val; if (time(&__val) == -1) { perror ("Time error"); }

Ответ 3



Функция time_t time(time_t *tloc) возвращает время в секундах (прошедшее с 01.01.1970 г.) и помещает его же в память по передаваемому ей указателю (адресу памяти). Теперь об ее интерфейсе (почему он такой). Вкратце, конечно, это старое наследство, доставшееся от первых версий Unix. Ее интерфейс в общем виде совпадает с интерфейсом устаревшей функции int ftime(struct timeb *tp), которая заполняла вот такую структуру: struct timeb { time_t time; unsigned short millitm; short timezone; short dstflag; }; и возвращала 0 при успешном вызове и -1 при ошибке (кстати, в то время, когда в программах еще использовалась ftime(), функция time() возвращала время в 32-bit типе long, а типа time_t тогда еще не было). В первом широко распространенном руководстве Stephen R. Bourne. The Unix System написано, что time() и ftime() это две точки входа в общую функцию, что объясняет сходство их интерфейсов. Такая вот, история развития системы.

Комментариев нет:

Отправить комментарий