2017-03-03 4 views
2

J'ai une variable de type time_t (de <time.h>) qui stocke l'heure d'un échec, et souhaite l'initialiser à une valeur "nulle" qui sera la valeur finale si aucune erreur ne se produit. Existe-t-il un moyen standard de définir une variable time_t sur une sorte de valeur nulle connue? Je vois que la fonction time() renvoie -1 si une erreur survient, peut-être que c'est mieux, mais je me demande si je peux simplement assigner une valeur entière à un typedef comme ça. Peut-être que je devrais utiliser ça ...?Comment représenter la valeur non initialisée pour le type time_t dans c

time_t failTime = (time_t)(-1);

+2

La réponse acceptée ici http://stackoverflow.com/questions/471248/what-is-ultimately-a-time-t-typedef-to indique « ISO C définit time_t comme un type arithmétique, mais ne spécifie pas de type, de plage, de résolution ou d'encodage particulier, ni les significations des opérations arithmétiques appliquées aux valeurs temporelles. " Donc, il semble que ce ne sera pas standard, quelle que soit votre solution. –

+3

'time_t failTime = -1;' est suffisant, sauf si le code tente de travailler avec d'autres valeurs négatives de 'time_t' - ce qui est assez rare. – chux

+0

Je suppose qu'il n'y a aucune raison de lancer un littéral entier – robisrob

Répondre

4

OP Comme mentionné, le résultat d'un échec time() (et d'autres fonctions de la bibliothèque standard C) est (time_t)(-1), il est donc au moins raisonnable pour initialiser time_t à cette valeur « échec ».

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

time_t est un type réel et "entier et types réels flottants sont collectivement appelés types réels". time_t pourrait être un double, long, etc.

à proprement parler time_t peut coder un temps valide (time_t)(-1), mais qui ne se distingue pas d'un retour d'erreur pour diverses fonctions.

Étant donné la grande latitude de codage possible et considérant la pratique courante d'utiliser des secondes entières depuis le 1er janvier 1970, (time_t)(-1) est un choix raisonnable.

Une solution plus robuste (ou pédante) appairerait un drapeau avec la variable temps pour indiquer son exactitude. Exemple:

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

十 1 pour la solution la plus robuste. –

3

Si vous êtes coincé avec besoin de quelque chose qui dépend de rien que la base langage C, le mieux est de choisir un moment loin dans le passé que vous n'avez pas réellement besoin de représenter, ensemble dans un struct tm, et convertir en time_t avec mktime. Vous devrez peut-être boucler et réessayer jusqu'à ce que vous trouviez une valeur qui se convertit avec succès. Les systèmes typiques ont une gamme de temps représentables d'environ +/- 68 ans centrés sur 1970, mais vous ne pouvez pas nécessairement supposer le vôtre. Par contre, si vous utilisez une implémentation POSIX ou POSIX, vous pouvez supposer que time_t est un type arithmétique représentant le pseudo-UTC (plus comme UT1 ou "cloud-UTC" comme je l'appelle) secondes depuis le début de 1970. Ensuite, vous pouvez simplement choisir une grande valeur entière négative dans la plage du type time_t.