printf
был заимствован у C и имеет некоторые ограничения. Наиболее распространенным упомянутым ограничением printf
является безопасность типов, так как он полагается на программиста, чтобы правильно сопоставить строку формата с аргументами. Второе ограничение, которое снова возникает из среды varargs, заключается в том, что вы не можете расширять поведение с помощью определенных пользователем типов. printf
знает, как печатать набор типов, и это все, что вы выберете из него. Тем не менее, для некоторых вещей, для которых он может быть использован, быстрее и проще форматировать строки с printf
, чем с потоками C++.
В то время как большинство современных компиляторов могут решать ограничение безопасности типа и, по крайней мере, предоставлять предупреждения (компилятор может анализировать строку формата и проверять аргументы, предоставленные в вызове), второе ограничение не может быть преодолено. Даже в первом случае есть вещи, с которыми компилятор не может реально помочь, так как проверка нулевого завершения - но опять же, та же проблема связана с std::cout
, если вы используете его для печати того же массива.
На другом конце, потоки (в том числе std::cout
) может быть расширены для обработки пользовательских типов с помощью перегруженных std::ostream& operator<<(std::ostream&, type const &)
для любого заданного пользователя определенного типа type
. Они сами по себе являются безопасными типами - если вы переходите к типу, который не перегружен operator<<
, компилятор будет жаловаться. С другой стороны, они являются более громоздкими для производства форматированного вывода.
Итак, что вы должны использовать? В общем, я предпочитаю использовать потоки, так как перегрузка operator<<
для моих собственных типов проста и их можно использовать равномерно со всеми типами.
Если вы пишете код на C++, тогда вам, в общем, следует упомянуть идиомы и библиотеки C++. –
Это зависит от того, на каком языке вы пишете свою программу C или C++. Оба эти метода имеют разные языки, поэтому вы не можете сравнивать их напрямую. –
@Paul R. Спасибо за ваш ответ. Итак, не «printf()», а затем считается идиомой C++? –