Mezclar salidas de estilo C printf()
(o puts()
o putchar()
o ...) con std::cout << ...
salidas de estilo C ++ puede no ser seguro. Si recuerdo correctamente, pueden tener mecanismos de almacenamiento en búfer separados, por lo que la salida podría no aparecer en el orden previsto. (Como AProgrammer menciona en un comentario, sync_with_stdio
aborda esto).
printf()
es fundamentalmente de tipo inseguro. El tipo esperado para un argumento está determinado por la cadena de formato ( "%d"
requiere un int
o algo que promueva int
, "%s"
requiere un char*
que debe apuntar a una cadena de estilo C terminada correctamente, etc.), pero pasar el tipo de argumento incorrecto da como resultado un comportamiento indefinido , no es un error diagnosticable. Algunos compiladores, como gcc, hacen un trabajo razonablemente bueno de advertencia sobre las discrepancias de tipo, pero solo pueden hacerlo si la cadena de formato es literal o se conoce de otro modo en el momento de la compilación (que es el caso más común), y tal el idioma no requiere advertencias. Si pasa el tipo de argumento incorrecto, pueden suceder cosas arbitrariamente malas.
El flujo de E / S de C ++, por otro lado, es mucho más seguro, ya que el <<
operador está sobrecargado para muchos tipos diferentes. std::cout << x
no tiene que especificar el tipo de x
; el compilador generará el código correcto para cualquier tipo que x
tenga.
Por otro lado, printf
las opciones de formato de IMHO son mucho más convenientes. Si quiero imprimir un valor de punto flotante con 3 dígitos después del punto decimal, puedo usarlo "%.3f"
, y no tiene ningún efecto en otros argumentos, incluso dentro de la misma printf
llamada. C ++ setprecision
, por otro lado, afecta el estado de la secuencia y puede estropear la salida posterior si no tiene mucho cuidado de restaurar la secuencia a su estado anterior. (Este es mi motivo personal favorito; si me falta alguna forma limpia de evitarlo, comente).
Ambos tienen ventajas y desventajas. La disponibilidad de printf
es particularmente útil si tiene un fondo C y está más familiarizado con él, o si está importando código fuente C en un programa C ++. std::cout << ...
es más idiomático para C ++, y no requiere tanto cuidado para evitar desajustes de tipo. Ambos son C ++ válidos (el estándar C ++ incluye la mayoría de la biblioteca estándar C por referencia).
Es probablemente la mejor manera de utilizar std::cout << ...
por el bien de otros programadores de C ++ que pueden trabajar en su código, pero se puede utilizar cualquiera de ellos - en especial en el código de seguimiento que se va a tirar a la basura.
Y, por supuesto, vale la pena pasar un tiempo aprendiendo cómo usar depuradores (pero eso podría no ser factible en algunos entornos).
printf
en el mundo de C ++? Me estoy perdiendo algo aquí?