Come sbarazzarsi del avviso con time.h in C ++?
-
18-09-2019 - |
Domanda
Quando uso questo
#include<time.h>
//...
int n = time(0);
//...
Ho ricevuto un avviso giunto il momento di int conversione. C'è un modo per rimuovere questo avviso?
Soluzione
Ora ritorna time_t
e non intero. Usare quel tipo preferibilmente perché può essere maggiore di int
.
Se si ha realmente bisogno int
, quindi typecast esplicitamente, ad esempio:
int n = (int)time(0);
Altri suggerimenti
Sì, il cambiamento n per essere un time_t
. Se si guarda alla firma in time.h sulla maggior parte / tutti i sistemi, vedrai che questo è quello che ritorna.
#include<time.h>
//...
time_t n = time(0);
//...
Si noti che Arak ha ragione: con un 32 bit int è un problema, come minimo, a causa del bug 2038 . Tuttavia, si dovrebbe considerare che qualsiasi tipo di aritmetica su un intero n (piuttosto che un time_t) aumenta solo la probabilità che il codice sarà inciampare quel bug precoce.
PS: Nel caso in cui non ho fatto in chiaro nella risposta originale, la migliore risposta a un avviso del compilatore è quasi sempre di affrontare la situazione che sei stato avvertito circa. Ad esempio, costringendo i dati di maggiore precisione in una variabile di precisione inferiore perde le informazioni - il compilatore sta cercando di avvertire che si potrebbe avere appena creato un bug mina che qualcuno non inciampare solo molto più tardi
. Credo che si utilizza Visual C ++. Il tipo di ritorno di time(0)
è 64bit int
anche se si sta programmando per la piattaforma 32bit
a differenza g++
. Per rimuovere l'avviso, basta assegnare time(0)
a 64bit
variabile.
Probabilmente si desidera utilizzare un tipo di time_t invece di un int.
Si veda l'esempio a http://en.wikipedia.org/wiki/Time_t .
Il motivo è tempo di funzioni () restituisce un tempo time_t quindi potrebbe essere necessario fare un cast statico per un int o uint in questo caso. Scrivere in questo modo:
time_t timer;
int n = static_cast<int> (time(&timer)); // this will give you current time as an integer and it is same as time(NULL)