Da die Leute hier antworten, wie man den maximalen time_t
einstellt -Wert und weitere Vermutungen über seinen Typ anzustellen, dachte ich, ich würde die c++
hinzufügen Vorgehensweise:
#include <limits>
...
time_t maxTime = std::numeric_limits<time_t>::max();
Ich würde mich nicht so sehr darum kümmern, was in eine time_t
kommt , sondern darüber, was vernünftig ist. Auf jedem System, das ich gesehen habe, ein time_t
kann Zeitspannen zwischen 63 und 10 Jahren kodieren (so ziemlich jedes System, das ich kenne, verwendet 64-Bit-Zahlen, seit diese Genies 1999 das Jahr-2000-Weltuntergangsding erfunden haben, bleibt abzuwarten, wer das viel größere bemerken wird "Ereignis", wenn das Jahr 2038 vorbei ist).
Wenn Sie vernünftigerweise erwarten dass Ihr Programm nicht länger als 50 Jahre läuft, lehnen Sie jeden Wert ab, der größer als 50*365*86400 ist, oder sättigen Sie einfach den Wert. Ich erwarte nicht, dass eines der Programme, die ich jetzt schreibe, in 50 Jahren verwendet wird (obwohl ich das nicht mehr erleben werde).
Andererseits, wenn Ihr System das tut Verwenden Sie ein 32-Bit-time_t
, dann ist es sowieso egal, denn die Systemzeit wird so oder so in 50 Jahren übergelaufen sein, also kann man ohne Epochenwechsel sowieso keine sinnvolle Zeit konstruieren.
Wenn Sie fragen "Wie lange möchten Sie pausieren?" und der Benutzer "250 Jahre" sagt, würde ich es nicht wirklich für ein falsches Programmverhalten halten, wenn Sie sagen "ja richtig, 50 reichen auch". Denn, hey, der Unterschied ist wirklich nicht wahrnehmbar.
Laut Wikipedia time_t
kann eine Ganzzahl oder Gleitkommazahl sein, ist aber normalerweise eine 32-Bit- oder 64-Bit-Ganzzahl mit Vorzeichen. Ich denke, der größte sichere Wert, den Sie annehmen können, ist INT_MAX
. Für time_t
zumindest negative Zahlen sind legal und beziehen sich auf die Zeit vor dem 1. Januar 1970.
Leider sieht der ISO-C-Standard (derzeit C11) keine Möglichkeit vor, den Maximalwert von time_t
zu erreichen . Wenn man also keine Tools wie Autoconf verwendet, die Informationen liefern, muss man einige Annahmen treffen.
Angenommen, time_t
ein Integer-Typ ohne Füllbits ist (was heutzutage auf den meisten Plattformen der Fall ist, wenn nicht auf allen), kann man wahrscheinlich nehmen:
(((time_t) 1 << (sizeof(time_t) * CHAR_BIT - 2)) - 1) * 2 + 1
was der maximal darstellbare Wert für einen vorzeichenbehafteten Integer-Typ ist (aber die Tatsache, dass ein Wert in time_t
darstellbar ist bedeutet nicht, dass es vom System als time_t
unterstützt wird Wert).
Man möchte vielleicht auch erkennen, ob time_t
ist ein ganzzahliger Typ. Der ISO-C-Standard legt fest, dass time_t
ein reeller Typ ist (Abschnitt 7.27.1). Per Definition ein echter Typ ist entweder ein Integer-Typ oder ein echter Floating-Typ (float
, double
oder long double
, und möglicherweise andere, die in zukünftigen Versionen des Standards hinzugefügt werden, wie in Abschnitt 6.11.1 erwähnt). Wenn also time_t
ist kein Integer-Typ, es ist notwendigerweise ein echter Floating-Typ. Als Folge kann man erkennen, ob time_t
ist ein ganzzahliger Typ mit dem Test (time_t) 1 / 2 == 0
.
Hinweis:Der C-Standard verlangt nicht unbedingt, dass (T) 1 / 2
von 0 verschieden sein, wenn T
ist ein Floating-Typ, aber wenn dies nicht der Fall ist, vermute ich, dass solche Plattformen ernsthafte Probleme mit Floating-Point-Berechnungen haben würden.