2017-03-03 2 views
2

Ich habe eine Variable vom Typ time_t (von <time.h>), die die Zeit eines Fehlers speichert, und möchte es auf einen "Null" -Wert initialisieren, der der endgültige Wert ist, wenn Es ist kein Fehler aufgetreten. Gibt es eine Standardmethode, um eine time_t-Variable auf einen bekannten Nullwert zu setzen? Ich sehe, dass die time() Funktion -1 zurückgibt, wenn ein Fehler auftritt, vielleicht ist das das Beste, aber wundern Sie sich, wenn ich einem typedef so einen ganzzahligen Wert zuweisen kann. Vielleicht müsste ich das benutzen ...?Wie nicht initialisierte Wert für time_t Typ in c

time_t failTime = (time_t)(-1);

+2

Die akzeptierte Antwort hier http://stackoverflow.com/questions/471248/what-is-ultimately-a-time-t-typedef-to zeigt „ISO C definiert time_t als arithmetische Art, spezifiziert aber keinen bestimmten Typ, Bereich, Auflösung oder Kodierung dafür. Auch nicht spezifiziert sind die Bedeutungen von arithmetischen Operationen, die auf Zeitwerte angewendet werden. " Es klingt also so, als wäre es nicht standardisiert, was auch immer Ihre Lösung ist. –

+3

'time_t failTime = -1;' ist ausreichend, es sei denn, der Code versucht mit anderen negativen Werten von 'time_t' zu arbeiten - was etwas selten ist. – chux

+0

Ich nehme an, dass es keinen Grund gibt, ein Integer-Literal zu werfen – robisrob

Antwort

4

als OP bezeichnete, ist das Ergebnis von einer ausgefallenen time() (und anderen Standard-C-Bibliothek-Funktionen) ist (time_t)(-1), so dass es zumindest angemessenetime_t ist zu diesem „nicht bestanden“ Wert zu initialisieren.

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

time_t ist ein realer Typ und "integer und echte Floating-Typen werden kollektiv echte Typen genannt". time_t könnte ein double, long usw.

Streng sein time_t sprechen eine gültige Zeit als (time_t)(-1) kodieren könnte, doch das ist von einem Fehler Rückkehr für verschiedene Funktionen nicht unterscheidbar.

Angesichts der weiten Breite der möglichen Codierung und der üblichen Praxis, ganzzahlige Sekunden seit dem 1. Januar 1970 zu verwenden, ist (time_t)(-1) eine vernünftige Wahl.

Eine robustere (oder pedantische Lösung) würde ein Flag mit der Zeitvariablen paaren, um ihre Korrektheit anzuzeigen. Beispiel:

struct time_pedantic { 
    time_t t; 
    bool valid; 
} 
+1

for 1 for die robustere Lösung. –

3

Wenn Sie mit, um etwas stecken, die aber die Grund Sprache C auf nichts abhängt, ist, Ihre beste Wette Zeit weit in der Vergangenheit zu wählen, die Sie eigentlich gar nicht vertreten müssen, setzen Sie es in einem struct tm, und zu time_t mit mktime konvertieren. Möglicherweise müssen Sie eine Schleife erstellen und wiederholen, bis Sie einen Wert finden, der erfolgreich konvertiert wird. Typische Systeme haben einen Bereich von darstellbaren Zeiten von ungefähr +/- 68 Jahren, der auf 1970 zentriert ist, aber Sie können nicht notwendigerweise davon ausgehen, dass Ihrs tut.

Wenn Sie jedoch eine POSIX- oder POSIX-ähnliche Implementierung verwenden, können Sie annehmen, dass time_t ein arithmetischer Typ ist, der Pseudo-UTC (mehr wie UT1 oder "Cloud-UTC", wie ich es nenne) Sekunden nennt seit Anfang 1970. Dann können Sie einfach einen großen negativen ganzzahligen Wert im Bereich des time_t Typs wählen.

Verwandte Themen