Puisque les gens ici répondent comment définir le maximum time_t
valeur, et faire des suppositions quant à son type, j'ai pensé que j'ajouterais le c++
façon de faire :
#include <limits>
...
time_t maxTime = std::numeric_limits<time_t>::max();
Je ne me soucierais pas tellement de ce qui se passe dans un time_t
, mais sur ce qui est raisonnable. Sur tous les systèmes que j'ai vus, un time_t
peut encoder des périodes allant de 63 ans à 10 ans (presque tous les systèmes que je connais utilisent des nombres 64 bits depuis que ces génies ont inventé la fin du monde Y2K en 1999, il reste à voir qui remarquera le beaucoup plus grand "événement" lorsque l'année 2038 passe).
Si vous attendez raisonnablement que votre programme ne fonctionnera pas plus de 50 ans, rejetez toute valeur supérieure à 50*365*86400 ou saturez simplement la valeur. Je ne m'attends pas à ce qu'aucun des programmes que j'écris maintenant soit utilisé dans 50 ans (bien que je ne vivrai pas pour le vérifier).
D'un autre côté, si votre système fait utiliser un time_t
32 bits , alors cela n'a pas d'importance de toute façon, car le temps système aura survolé dans 50 ans de toute façon, donc on ne peut pas construire un temps significatif de toute façon sans changer d'époque.
Si vous demandez "combien de temps voulez-vous faire une pause ?" et que l'utilisateur dit "250 ans", je considérerais qu'il ne s'agit pas d'un comportement de programme vraiment incorrect si vous disiez "ouais, d'accord, 50 suffiront aussi". Parce que, hé, la différence n'est vraiment pas observable.
Selon Wikipédia, time_t
peut être un entier ou un nombre à virgule flottante, mais il s'agit généralement d'un entier signé 32 bits ou 64 bits. Je pense que la plus grande valeur sûre que vous pouvez supposer est INT_MAX
. Pour time_t
au moins les nombres négatifs sont légaux et se réfèrent avant le 1er janvier 1970.
Malheureusement, la norme ISO C (actuellement C11) ne fournit aucun moyen d'obtenir la valeur maximale de time_t
. Donc, à moins d'utiliser des outils comme Autoconf fournissant des informations, il faut faire quelques hypothèses.
En supposant que time_t
est un type entier sans bits de remplissage (ce qui est le cas sur la plupart des plates-formes de nos jours, sinon toutes), on peut probablement prendre :
(((time_t) 1 << (sizeof(time_t) * CHAR_BIT - 2)) - 1) * 2 + 1
qui est la valeur maximale représentable pour un type entier signé (mais le fait qu'une valeur soit représentable en time_t
ne signifie pas qu'il est pris en charge par le système en tant que time_t
valeur).
On peut aussi vouloir détecter si time_t
est un type entier. La norme ISO C spécifie que time_t
est un type réel (Clause 7.27.1). Par définition, un type réel est soit un type entier soit un type réel flottant (float
, double
ou long double
, et éventuellement d'autres ajoutés dans les futures versions de la norme, comme mentionné à l'article 6.11.1). Ainsi, si time_t
n'est pas un type entier, c'est nécessairement un vrai type flottant. En conséquence, on peut détecter si time_t
est un type entier avec le test (time_t) 1 / 2 == 0
.
Remarque :La norme C n'exige pas strictement que (T) 1 / 2
être différent de 0 si T
est un type flottant, mais si ce n'est pas le cas, je soupçonne que de telles plates-formes auraient de sérieux problèmes avec les calculs en virgule flottante.