time_t статья статьи Wikipedia проливает некоторый свет на это. Нижняя строка - то, что тип time_t
не гарантируется в спецификации C.
time_t
тип данных является типом данных в библиотеке ISO C, определенной для хранения значений системного времени. Такие значения возвращаются из стандартаtime()
библиотечная функция. Этот тип является определением типа, определенным в стандартном заголовке. ISO C определяет time_t как арифметический тип, но не определяет никакого конкретного типа , диапазона, разрешения, или кодирующий для него. Также неуказанный значения арифметических операций, относился к временным стоимостям.Unix и совместимые POSIX системы реализуют эти
time_t
тип какsigned integer
(обычно 32 или 64 бита шириной), который представляет число секунд начиная с запуска эпохи Unix : полночь UTC от 1 января 1970 (не считающий секунды прыжка). Некоторые системы правильно обрабатывают отрицательные временные стоимости, в то время как другие не делают. Системы с помощью 32-разрядногоtime_t
тип восприимчивы к 117-летней проблеме 2038 года .
[root]# cat time.c
#include <time.h>
int main(int argc, char** argv)
{
time_t test;
return 0;
}
[root]# gcc -E time.c | grep __time_t
typedef long int __time_t;
Это определяется в $INCDIR/bits/types.h
через:
# 131 "/usr/include/bits/types.h" 3 4
# 1 "/usr/include/bits/typesizes.h" 1 3 4
# 132 "/usr/include/bits/types.h" 2 3 4
В соответствии с Visual Studio 2008, это принимает значение по умолчанию к __int64
, если Вы не определяете _USE_32BIT_TIME_T
. Вы более обеспечены просто притворство, что Вы не знаете то, что это определяется как, так как это может (и быть) изменение от платформы до платформы.
Это - 32-разрядный тип целого числа со знаком на наиболее платформах прежней версии. Однако это заставляет Ваш код страдать от 110-летней ошибки 2038 года . Таким образом, современные библиотеки C должны определять его, чтобы быть 64-разрядным интервалом со знаком вместо этого, который безопасен в течение нескольких миллиардов лет.