La miscelazione di output in stile C printf()
(o puts()
o putchar()
o ...) con std::cout << ...
output in stile C ++ può non essere sicura. Se ricordo bene, possono avere meccanismi di buffering separati, quindi l'output potrebbe non apparire nell'ordine previsto. (Come menziona AProgrammer in un commento, si sync_with_stdio
rivolge a questo).
printf()
è fondamentalmente non sicuro. Il tipo previsto per un argomento è determinato dalla stringa di formato ( "%d"
richiede uno int
o qualcosa che promuove int
, "%s"
richiede uno char*
che deve puntare a una stringa di tipo C terminata correttamente, ecc.), Ma il passaggio di un tipo di argomento errato provoca un comportamento indefinito , non un errore diagnosticabile. Alcuni compilatori, come gcc, fanno un buon lavoro di avvertimento sui disallineamenti dei tipi, ma possono farlo solo se la stringa di formato è letterale o è altrimenti nota al momento della compilazione (che è il caso più comune) - e simili gli avvisi non sono richiesti dalla lingua. Se passi il tipo di argomento sbagliato, possono accadere cose arbitrariamente cattive.
L'I / O stream di C ++, d'altra parte, è molto più sicuro, poiché l' <<
operatore è sovraccarico per molti tipi diversi. std::cout << x
non è necessario specificare il tipo di x
; il compilatore genererà il codice giusto per qualunque tipo x
abbia.
D'altra parte, printf
le opzioni di formattazione sono IMHO molto più convenienti. Se voglio stampare un valore in virgola mobile con 3 cifre dopo il punto decimale, posso usare "%.3f"
- e non ha alcun effetto su altri argomenti, anche all'interno della stessa printf
chiamata. Il C ++ setprecision
, d'altra parte, influenza lo stato del flusso e può rovinare l'output successivo se non stai molto attento a ripristinare il flusso al suo stato precedente. (Questa è la mia pipì personale per animali domestici; se mi manca un modo pulito per evitarlo, si prega di commentare.)
Entrambi hanno vantaggi e svantaggi. La disponibilità di printf
è particolarmente utile se ti capita di avere uno sfondo C e ne hai più familiarità o se stai importando il codice sorgente C in un programma C ++. std::cout << ...
è più idiomatico per C ++ e non richiede troppe cure per evitare discrepanze tra i tipi. Entrambi sono C ++ validi (lo standard C ++ include la maggior parte della libreria standard C per riferimento).
E ' probabilmente meglio usare std::cout << ...
per il bene di altri programmatori C ++ che possono lavorare sul vostro codice, ma è possibile utilizzare uno dei due - in particolare nel codice di traccia che si sta andando a buttare via.
E ovviamente vale la pena dedicare un po 'di tempo ad imparare come usare i debugger (ma ciò potrebbe non essere fattibile in alcuni ambienti).
printf
nel mondo C ++? Mi manca qualcosa qui?