Come ha detto AraK, l'interfaccia di flussi c ++ funzionerà sempre in modo portabile.
std :: size_t s = 1024; std :: cout << s; // o qualsiasi altro tipo di stream come stringstream!
Se si desidera C stdio, non esiste una risposta portatile a questa in alcuni casi di "portatile". E diventa brutto da quando hai visto, scegliere i flag di formato errati può produrre un avviso del compilatore o fornire un output errato.
C99 ha provato a risolvere questo problema con formati inttypes.h come "%" PRIdMAX "\ n". Ma proprio come con "% zu", non tutti supportano c99 (come MSVS prima del 2013). Ci sono file "msinttypes.h" che fluttuano intorno per risolvere questo problema.
Se si esegue il cast di un tipo diverso, a seconda dei flag, è possibile che venga visualizzato un avviso del compilatore per il troncamento o una modifica del segno. Se segui questo percorso, scegli un tipo di dimensione fissa rilevante più grande. Uno di unsigned long long e "% llu" o unsigned long "% lu" dovrebbe funzionare, ma llu può anche rallentare le cose in un mondo a 32 bit eccessivamente grande. (Modifica: il mio mac emette un avviso a 64 bit per% llu che non corrisponde a size_t, anche se% lu,% llu e size_t hanno tutte le stesse dimensioni. E% lu e% llu non hanno le stesse dimensioni sul mio MSVS2012. potrebbe essere necessario eseguire il cast + utilizzare un formato corrispondente.)
In questo caso, puoi scegliere tipi di dimensioni fisse, come int64_t. Ma aspetta! Ora torniamo a c99 / c ++ 11 e MSVS precedente fallisce di nuovo. Inoltre hai anche cast (ad esempio map.size () non è un tipo di dimensione fissa)!
Puoi utilizzare un'intestazione o una libreria di terze parti come boost. Se non ne stai già utilizzando uno, potresti non voler gonfiare il tuo progetto in quel modo. Se sei disposto ad aggiungerne uno solo per questo problema, perché non utilizzare flussi c ++ o compilazione condizionale?
Quindi sei impegnato in flussi c ++, compilazione condizionale, framework di terze parti o qualcosa di portatile che sembra funzionare per te.
unsigned long
è l'opzione migliore se l'implementazione di libc non supporta ilz
modificatore; lo standard C99 raccomanda disize_t
non avere un rango di conversione intero maggiore dilong
, quindi sei ragionevolmente sicuro