I would like say that extensibility lack of printf
is not entirely true:
In C, it is true. But in C, there are no real classes.
In C++, it is possible to overload cast operator, so, overloading a char*
operator and using printf
like this:
Foo bar;...;printf("%s",bar);
can be possible, if Foo overload the good operator. Or if you made a good method. In short, printf
is as extensible as cout
for me.
Technical argument I can see for C++ streams (in general... not only cout.) are:
Typesafety. (And, by the way, if I want to print a single
'\n'
I useputchar('\n')
... I will not use a nuke-bomb to kill an insect.).Simpler to learn. (no "complicated" parameters to learn, just to use
<<
and>>
operators)Work natively with
std::string
(forprintf
there isstd::string::c_str()
, but forscanf
?)
For printf
I see:
Easier, or at least shorter (in term of characters written) complex formatting. Far more readable, for me (matter of taste I guess).
Better control of what the function made (Return how many characters where written and there is the
%n
formatter: "Nothing printed. The argument must be a pointer to a signed int, where the number of characters written so far is stored." (from printf - C++ Reference)Better debugging possibilities. For same reason as last argument.
My personal preferences go to printf
(and scanf
) functions, mainly because I love short lines, and because I don't think type problems on printing text are really hard to avoid.The only thing I deplore with C-style functions is that std::string
is not supported. We have to go through a char*
before giving it to printf
(with the std::string::c_str()
if we want to read, but how to write?)