Смешивание вывода в стиле C printf()
(или puts()
или putchar()
или ...) с выводом в стиле C ++ std::cout << ...
может быть небезопасным. Если я правильно помню, у них могут быть отдельные механизмы буферизации, поэтому выходные данные могут не отображаться в намеченном порядке. (Как AProgrammer упоминает в комментарии, sync_with_stdio
обращается к этому).
printf()
принципиально небезопасен. Тип, ожидаемый для аргумента, определяется форматной строкой ( "%d"
требуется символ int
или что-то, что повышается int
, "%s"
требуется элемент, char*
который должен указывать на правильно завершенную строку в стиле C и т. Д.), Но передача неверного типа аргумента приводит к неопределенному поведению , не диагностируемая ошибка. Некоторые компиляторы, такие как gcc, достаточно хорошо предупреждают о несоответствиях типов, но они могут делать это только в том случае, если строка формата является литералом или иным образом известна во время компиляции (что является наиболее распространенным случаем) - и так далее. предупреждения не требуются языком. Если вы передадите неправильный тип аргумента, может произойти сколь угодно плохое.
С другой стороны, потоковый ввод / вывод в C ++ намного более безопасен для типов, поскольку <<
оператор перегружен для множества различных типов. std::cout << x
не нужно указывать тип x
; компилятор сгенерирует правильный код для любого типа x
.
С другой стороны, printf
параметры форматирования ИМХО гораздо удобнее. Если я хочу напечатать значение с плавающей точкой с 3 цифрами после десятичной точки, я могу использовать "%.3f"
- и это не влияет на другие аргументы, даже в пределах того же самого printf
вызова. С ++ setprecision
, с другой стороны, влияет на состояние потока и может испортить последующий вывод, если вы не очень осторожны, чтобы вернуть поток в его предыдущее состояние. (Это моя личная любимая мозоль; если мне не хватает какого-то чистого способа избежать этого, пожалуйста, прокомментируйте.)
Оба имеют свои преимущества и недостатки. Доступность printf
особенно полезна, если у вас есть фон C и вы с ним более знакомы, или если вы импортируете исходный код C в программу C ++. std::cout << ...
более идиоматичен для C ++ и не требует особого внимания, чтобы избежать несоответствия типов. Оба являются действительными C ++ (стандарт C ++ включает в себя большую часть стандартной библиотеки C по ссылке).
Вероятно, это лучше всего использовать std::cout << ...
ради других программистов C ++, которые могут работать над вашим кодом, но вы можете использовать любой из них - особенно в коде трассировки, который вы собираетесь выбросить.
И, конечно, стоит потратить некоторое время на изучение того, как использовать отладчики (но в некоторых средах это может оказаться невозможным).
printf
в мире C ++? Я что-то здесь упускаю?