1) Вы можете использовать только printf
для основных типов, так и для целых чисел это действительно только использовать для «родных» типов int
, long int
и т.д. Что-то вроде uint32_t
требует довольно неудобные и громоздкие макросы для портативной печати. Пользовательские типы не поддерживаются вообще.
2) printf
не является типичным. То есть, правильность вашего кода зависит от значения значения строки форматирования, и вы не можете определить, хорошо ли ваша программа сформирована только из статического анализа. Это фундаментальная слабость C-типа, которую «правильный» C++ избегает.
Это говорит о том, что printf
(или, возможно, (v)snprintf
, скорее), как правило, довольно быстро, чем iostreams, поэтому в высокопроизводительном контексте (например, высокочастотном протоколировании) это очень конкурентоспособная альтернатива. Однако, если у вас есть только периодические операции вывода, вы должны предпочесть iostreams или какой-либо другой гибкий, типичный, идиоматический метод C++. (И, по общему признанию, iostreams, вероятно, является одним из самых ужасных уголков C++.)
Если вы можете использовать Boost, используйте Boost.Format. Библиотека C++ iostream медленная и громоздкая. Библиотека C stdio не безопасна для типов. –