Как представить неинициализированное значение для типа time_t в c

У меня есть переменная типа time_t (из <time.h>), в которой хранится время сбоя, и я хотел бы инициализировать ее значением «null», которое будет окончательным значением, если не произойдет ошибки. Есть ли стандартный способ установить для переменной time_t какое-то известное нулевое значение? Я вижу, что функция time() возвращает -1, если возникает ошибка, может быть, это лучше всего, но интересно, могу ли я просто присвоить целочисленное значение такому typedef. Может быть, мне нужно использовать это...?

time_t failTime = (time_t)(-1);


person robisrob    schedule 03.03.2017    source источник
comment
Принятый ответ здесь stackoverflow.com/questions/471248/ указывает, что ISO C определяет time_t как арифметический тип, но не указывает для него какой-либо конкретный тип, диапазон, разрешение или кодировку. Также не указаны значения арифметических операций, применяемых к значениям времени. Так что, похоже, это будет нестандартно, каким бы ни было ваше решение.   -  person Topological Sort    schedule 03.03.2017
comment
time_t failTime = -1; достаточно, если только код не пытается работать с другими отрицательными значениями time_t, что случается довольно редко.   -  person chux - Reinstate Monica    schedule 03.03.2017
comment
Я полагаю, что нет причин приводить целочисленный литерал   -  person robisrob    schedule 03.03.2017
comment
@robisrob потенциальная причина для приведения - соответствовать использованию (time_t)(-1) в спецификации C. AFIAK, система может использовать unsigned long long как time_t, и тогда приведение необходимо, чтобы успокоить педантичное предупреждение о присвоении знакового значения беззнаковой переменной.   -  person chux - Reinstate Monica    schedule 03.03.2017
comment
Что вы имеете в виду со значением NULL? NULL — это макрос с константой нулевого указателя. Ничего, что вы хотите назначить time_t.   -  person too honest for this site    schedule 03.03.2017
comment
@olaf цитируемый NULL в этом посте не подразумевает NULL, константу нулевого указателя, а недопустимое значение по умолчанию, которое time_t, надеюсь, не использует. Это тонкий подтекст, который легко спутать с буквальным первым чтением.   -  person chux - Reinstate Monica    schedule 03.03.2017
comment
@chux: Мне кажется, это еще одна проблема XY.   -  person too honest for this site    schedule 03.03.2017
comment
@Olaf Если ответ не 42, все вопросы проблемы XY.. ;-)   -  person chux - Reinstate Monica    schedule 03.03.2017


Ответы (2)


Как упоминалось OP, результатом сбоя time() (и других стандартных функций библиотеки C) является (time_t)(-1), поэтому по крайней мере разумно инициализировать time_t до этого значения «сбой».

// Just like OP
time_t failTime = (time_t)(-1);

time_t является реальным типом, а "целочисленные и вещественные плавающие типы вместе называются реальными типами" . time_t может быть double, long и т. д.

Строго говоря, time_t может кодировать допустимое время как (time_t)(-1), но это неотличимо от возврата ошибки для различных функций.

Учитывая широкую широту возможного кодирования и принимая во внимание распространенную практику использования целых секунд с 1 января 1970 года, (time_t)(-1) является разумным выбором.

Более надежное (или педантичное) решение будет сочетать флаг с переменной времени, чтобы указать ее правильность. Пример:

struct time_pedantic {
  time_t t;
  bool valid;
}
person chux - Reinstate Monica    schedule 03.03.2017
comment
十1 для более надежного решения. - person R.. GitHub STOP HELPING ICE; 03.03.2017

Если вам нужно что-то, что не зависит ни от чего, кроме базового языка C, лучше всего выбрать время в далеком прошлом, которое вам на самом деле не нужно представлять, установить его в struct tm и преобразовать в time_t с mktime. Возможно, вам придется зацикливаться и повторять попытки, пока не найдете значение, которое успешно преобразуется. Типичные системы имеют диапазон представляемых времен около +/- 68 лет с центром в 1970 году, но вы не можете обязательно предполагать, что у вас есть.

С другой стороны, если вы используете POSIX или POSIX-подобную реализацию, вы можете предположить, что time_t является арифметическим типом, представляющим псевдо-UTC (больше похоже на UT1 или «облачное-UTC», как я его называю) секунды с начала 1970. Тогда вы можете просто выбрать большое отрицательное целое значение в диапазоне типа time_t.

person R.. GitHub STOP HELPING ICE    schedule 03.03.2017