Ответ 1
Там нет реальной выгоды в том, как это определено в настоящее время.
Я подозреваю, что когда функция time()
была впервые определена, она использовала тип, который нельзя было вернуть из функции. У очень ранних реализаций C не было long int
и они не смогли вернуть структуры из функций. В системе с 16-битными ints единственным способом представления времени будет структура или массив; 16 бит в секундах меньше, чем на один день.
Таким образом, ранние реализации time()
могли быть использованы примерно так (спекуляция):
time_t now;
time(&now); /* sets now.time_high, now.time_low */
или, возможно:
int now[2];
time_t(now); /* sets now[0], now[1] */
Когда более поздние реализации C добавили более длинные целые числа и возможность возвращать структуры по значению, была добавлена возможность вернуть значение time_t
из функции time()
, но старые функции были сохранены, чтобы избежать нарушения существующего кода.
Я думаю, что если бы time()
определялось сегодня, это выглядело бы следующим образом:
time_t time(void);
Я не смог подтвердить, что старые реализации функции time()
работали таким образом (попробуйте Googling "time"!), но это имеет смысл, учитывая историю языка.
Если вы передаете нулевой указатель на функцию time()
, он возвращает текущее время, не сохраняя его в переменной; это позволяет избежать некоторого штрафа за производительность:
time_t now = time(NULL);