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

192
04 июня 2021, 01:00

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

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

Answer 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 в случае ошибки.

Answer 2

Вероятнее всего потому что это функция из С, а в нём есть принцип возврата кода ошибки функции. В случае неудачи он вернёт -1, и если надо проверить, то просто сделать:

time_t __val;
if (time(&__val) == -1)
{
  perror ("Time error");
}
Answer 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() это две точки входа в общую функцию, что объясняет сходство их интерфейсов.

Такая вот, история развития системы.

READ ALSO
C++ и циклические зависимости

C++ и циклические зависимости

Я хочу понять, существует ли какой-то единый способ лечения циклических зависимостей?

109
CodeBlocks не ставит автоматические табы

CodeBlocks не ставит автоматические табы

CodeBlocks на Ubuntu 1804 не форматирует фигурные скобки как в Windows версии

84
Разместить время в таблице

Разместить время в таблице

Подскажите пожалуйста, как сделать что бы время было по центру border-right?

103
Почему не работает в хроме?

Почему не работает в хроме?

Есть сайт: http://demoinfinity-web

347