2013-08-30 7 views
9

I printf e scanf famiglie di funzioni in C consumano una manciata di identificatori di formato primitive che corrispondono ai tipi di dati fondamentali – %d per int, %llu per unsigned long long int, eccPosix fornisce macro di stringhe di formato per printf/scanf?

Tuttavia, ci sono un gran numero di tipo standardizzato alias che si vorrebbe utilizzare nella pratica, come ad esempio int32fast_t e uno non può e non deve conoscere il tipo fondamentale sottostante. Per gli alias in stdint.h, lo standard C specifica per fortuna un set di macro per generare le stringhe di formato corrispondenti, come , in inttypes.h.

Esiste un analogo set di macro per Posix? Posix ha tonnellate di tipi opachi come ssize_t, pid_t, rlim_t, suseconds_t, ecc., Che sono tutte variazioni sui tipi di base di base. Come si può usare questi tipi in modo passivo nelle stringhe di formato?

+2

se tutto il resto fallisce, è sempre possibile convertire in '(u) intmax_t' e stampare quello – Christoph

+0

Soluzioni alternative interessanti - Non ho mai pensato: -S –

+0

(Anche se andando all'indietro, cioè' scanf', dovrei fare un controllo di overflow manuale e capire cosa confrontare esattamente) –

risposta

0

Posix garantisce che i valori sys/types.h sono un "tipo aritmetico di lunghezza appropriata" con pochi altri come ulteriormente specificato come "lunghezza estesa" non firmata o firmata. L'unico metodo accettabile per gli standard è quello di trasferirlo tramite cast nel più grande tipo di lingua appropriato (u) intmax_t e quindi inviarlo.

Inserirli sarebbe più pericoloso (ad esempio, non possibile in un modo conforme agli standard) in quanto sarebbe difficile garantire che la conversione al tipo di base non abbia overflow.

1

Il pacchetto sfio (parte del software AST open source AT & T Labs) ha funzioni analoghe a printf e scanf che consentono di specificare la dimensione del valore numerico (in genere utilizzando sizeof()) come parametro aggiuntivo. Alcuni esempi:

sfprintf(sfstdout, "%I*d", sizeof(intval), intval); 
sfscanf(sfstdin, "%I*f", sizeof(fltval), &fltval); 

Carta USENIX: Extended Data Formatting Using Sfio.