Protože lidé zde odpovídají, jak nastavit maximum time_t
a další odhady ohledně jeho typu, myslel jsem, že přidám c++
způsob, jak to udělat:
#include <limits>
...
time_t maxTime = std::numeric_limits<time_t>::max();
Moc by mě nezajímalo, co je součástí time_t
, ale o tom, co je rozumné. Na jakémkoli systému, který jsem viděl, time_t
dokáže zakódovat časové rozpětí kdekoli od 63 let do 10 let (skoro každý systém, který znám, používá 64bitová čísla, od té doby, co tito géniové přišli v roce 1999 s věcí Y2K, která skončí světem, se teprve uvidí, kdo si všimne mnohem většího „událost“, až uplyne rok 2038).
Pokud rozumně očekáváte že váš program nebude běžet déle než 50 let, odmítněte jakoukoli hodnotu větší než 50*365*86400 nebo hodnotu jednoduše nasyťte. Neočekávám, že některý z programů, které nyní píšu, se bude používat za 50 let (ačkoli se toho nedožiji, abych to ověřil).
Na druhou stranu, pokud váš systém dělá použijte 32bitový time_t
, pak na tom stejně nezáleží, protože systémový čas přeteče za 50 let tak či tak, takže stejně nelze sestrojit smysluplný čas bez posunutí epochy.
Pokud se zeptáte "jak dlouho chcete pauzu?" a uživatel říká „250 let“, nepovažoval bych to za skutečně nesprávné chování programu, pokud byste řekli „ano, správně, 50 bude také stačit“. Protože, hej, rozdíl opravdu není pozorovatelný.
Podle Wikipedie time_t
může být celé číslo nebo číslo s pohyblivou řádovou čárkou, ale obvykle se jedná o 32bitové nebo 64bitové celé číslo se znaménkem. Myslím, že největší bezpečná hodnota, kterou můžete předpokládat, je INT_MAX
. Pro time_t
alespoň záporná čísla jsou legální a vztahují se k 1. lednu 1970.
Bohužel norma ISO C (aktuálně C11) neposkytuje žádný způsob, jak získat maximální hodnotu time_t
. Pokud tedy člověk nepoužívá nástroje, jako je Autoconf poskytující informace, je třeba udělat nějaké předpoklady.
Za předpokladu, že time_t
je celočíselný typ bez výplňových bitů (což je případ většiny dnešních platforem, ne-li všech), lze pravděpodobně vzít:
(((time_t) 1 << (sizeof(time_t) * CHAR_BIT - 2)) - 1) * 2 + 1
což je maximální reprezentovatelná hodnota pro typ celého čísla se znaménkem (ale skutečnost, že hodnotu lze reprezentovat v time_t
neznamená, že je systémem podporován jako time_t
hodnota).
Můžete také chtít zjistit, zda time_t
je celočíselný typ. Norma ISO C určuje, že time_t
je skutečný typ (bod 7.27.1). Podle definice skutečný typ je buď celočíselný typ, nebo skutečný plovoucí typ (float
, double
nebo long double
a případně další přidané v budoucích verzích normy, jak je uvedeno v článku 6.11.1). Pokud tedy time_t
není celočíselný typ, je to nutně skutečný plovoucí typ. V důsledku toho lze zjistit, zda time_t
je celočíselný typ s testem (time_t) 1 / 2 == 0
.
Poznámka:Standard C striktně nevyžaduje (T) 1 / 2
být odlišný od 0, pokud T
je plovoucí typ, ale pokud tomu tak není, mám podezření, že takové platformy by měly vážné problémy s výpočty s plovoucí desetinnou čárkou.