К чему time_t является в конечном счете определением типа?

187
задан Mark Amery 6 April 2019 в 09:49
поделиться

4 ответа

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 года .

169
ответ дан Zeta 23 November 2019 в 05:46
поделиться

[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
107
ответ дан Quassnoi 23 November 2019 в 05:46
поделиться

В соответствии с Visual Studio 2008, это принимает значение по умолчанию к __int64, если Вы не определяете _USE_32BIT_TIME_T. Вы более обеспечены просто притворство, что Вы не знаете то, что это определяется как, так как это может (и быть) изменение от платформы до платформы.

7
ответ дан Eclipse 23 November 2019 в 05:46
поделиться

Это - 32-разрядный тип целого числа со знаком на наиболее платформах прежней версии. Однако это заставляет Ваш код страдать от 110-летней ошибки 2038 года . Таким образом, современные библиотеки C должны определять его, чтобы быть 64-разрядным интервалом со знаком вместо этого, который безопасен в течение нескольких миллиардов лет.

4
ответ дан 23 November 2019 в 05:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: