Mélanger une sortie de style C printf()
(ou puts()
ou putchar()
ou ...) avec une sortie de style C ++ std::cout << ...
peut être dangereux. Si je me souviens bien, ils peuvent avoir des mécanismes de mise en mémoire tampon distincts, de sorte que la sortie peut ne pas apparaître dans l'ordre prévu. (Comme AProgrammer le mentionne dans un commentaire, sync_with_stdio
traite de cela).
printf()
est fondamentalement dangereux pour les types. Le type attendu pour un argument est déterminé par la chaîne de format ( "%d"
nécessite un int
ou quelque chose qui promeut int
, "%s"
nécessite un char*
qui doit pointer vers une chaîne de style C correctement terminée, etc.), mais le fait de passer le mauvais type d'argument entraîne un comportement indéfini , pas une erreur diagnostiquable. Certains compilateurs, tels que gcc, font un assez bon travail d'avertissement sur les incompatibilités de type, mais ils ne peuvent le faire que si la chaîne de format est un littéral ou est autrement connue au moment de la compilation (ce qui est le cas le plus courant) - et tel les avertissements ne sont pas requis par la langue. Si vous passez le mauvais type d'argument, des choses arbitrairement mauvaises peuvent se produire.
Les E / S de flux de C ++, en revanche, sont beaucoup plus sécuritaires <<
pour les types , car l' opérateur est surchargé pour de nombreux types différents. std::cout << x
n'a pas besoin de spécifier le type de x
; le compilateur générera le bon code pour tout type de x
fichier.
D'un autre côté, printf
les options de formatage de sont à mon humble avis beaucoup plus pratiques. Si je veux imprimer une valeur à virgule flottante avec 3 chiffres après la virgule décimale, je peux l'utiliser "%.3f"
- et cela n'a aucun effet sur les autres arguments, même dans le même printf
appel. Les C ++ setprecision
, d'autre part, affectent l'état du flux et peuvent gâcher la sortie ultérieure si vous ne faites pas très attention à restaurer le flux à son état précédent. (Ceci est ma bête noire personnelle; si je manque un moyen propre de l'éviter, veuillez commenter.)
Les deux ont des avantages et des inconvénients. La disponibilité de printf
est particulièrement utile si vous avez un arrière-plan C et que vous le connaissez mieux, ou si vous importez du code source C dans un programme C ++. std::cout << ...
est plus idiomatique pour C ++, et n'exige pas autant de soin pour éviter les décalages de type. Les deux sont valides C ++ (la norme C ++ inclut la plupart de la bibliothèque standard C par référence).
Il est probablement préférable de l'utiliser std::cout << ...
pour le plaisir d'autres programmeurs C ++ qui peuvent travailler sur votre code, mais vous pouvez utiliser l'un ou l'autre - en particulier dans le code de trace que vous allez jeter.
Et bien sûr, cela vaut la peine de passer du temps à apprendre à utiliser les débogueurs (mais cela pourrait ne pas être possible dans certains environnements).
printf
dans le monde C ++? Il me manque quelque chose ici?