portatile modo per affrontare la 64/32 bit time_t

Ho un po ‘ di codice che è costruito sia su Windows e Linux. Linux, a questo punto, sempre a 32bit di Windows è a 32 e 64bit. Windows vuole avere time_t essere a 64 bit e Linux ha ancora come 32 bit. Io sto bene, tranne in alcuni luoghi time_t valori vengono convertiti in stringhe. Così, quando time_T è a 32 bit dovrebbe essere fatto con %d e quando è a 64bit con %lld… qual è il modo intelligente per fare questo? Inoltre: come tutte le idee per trovare tutti i luoghi dove time_t sono passato a stile printf funzioni per risolvere questo problema?

modifica:
Mi si avvicinò con la dichiarazione del TT_FMT come “%d” o “%lld” e poi cambiando il mio printfs come in
printf(“tempo: %d, registro: blah”) per essere printf(“il tempo:” TT_FMT “, register: bla”)
C’è un modo migliore? E come faccio a trovarli tutti?

InformationsquelleAutor MK. | 2010-03-18



3 Replies
  1. 11

    Secondo standard C, time_t è un tipo aritmetico, “in grado di rappresentare i tempi”. Così, potrebbe essere double per esempio. (Posix parla in modo più esplicito, e anche le garanzie che time() restituisce il numero di secondi dall’Epoca, quest’ultima non è garantita da standard C.)

    Forse la soluzione più pulita è quello di convertire il valore di qualsiasi tipo che si desidera. Si potrebbe desiderare di uno di unsigned long long o unsigned long:

    printf("%llu\n", (unsigned long long)t);
    • Questo è sempre sembrato il metodo più pulito per me. Sembra un peccato che printf non includere un identificatore di formato per time_t valori, anche se era solo il %c comportamento da strftime.
    • Grazie, penso che mi piace, tranne time_t è firmato, io probabilmente utilizzare int64_t.
  2. 7

    Credo che l’unico veramente portatile, utilizzare strftime per convertire il time_t di una stringa.

    Se sei sicuro che sei solo su piattaforme dove time_t è un int, si potrebbe eseguire il cast di intmax_t (da stdint.h) e stampare utilizzando PRIdMAX (da inttypes.h).

    • Ora, (9 anni dopo questa risposta), si potrebbe utilizzare %jd in luogo di PRIdMAX come in snprintf(str, sizeof(str), "%jd", (intmax_t)i_am_a_time_t_var)
  3. 3

    Se si vuole andare con i macro identificatore, mi sento di raccomandare una piccola modifica. Invece di incapsulamento di tutta la identificatore di incapsulare solo il modificatore:

    #ifdef 64_BIT_TIME
      #define TT_MOD "ll"
    #else
      #define TT_MOD ""
    #endif

    e quindi utilizzarlo come questo:

    printf("current time in seconds is: %" TT_MOD "u", time(0));

    La ragione è che, mentre è soprattutto il secondo decimale, ogni tanto puoi hex (o forse volete 0 iniziali). Da solo con il modificatore di lì, si può facilmente scrivere:

    "%" TT_MOD "x"   //in hex
    "%08" TT_MOD "d"  //left pad with 0's so the number is at least 8 digits
    • Minore nitpick; i nomi delle macro non può iniziare con le cifre. Io probabilmente andare per un nome più come il <inttypes.h> nomi, senza invadere lo spazio dei nomi riservati (ISO/IEC 9899:2011 §7.31.6 Macro che iniziano con PRI o SCN, e una lettera minuscola o X può essere aggiunto per le macro definite in <inttypes.h> intestazione).

Lascia un commento