putc needs stdout, vs puts
C history question here. Why does the C function putc
require a second parame开发者_Go百科ter like
putc( 'c', stdout ) ;
While puts is oh so more convenient
puts( "a string" ) ;
There is a function in msvc++
putchar( 'c' ) ;
Which works the way one might expect putc
to work. I thought the second parameter of putc
was to be able to direct putc
to a file, but there is a function fputc
for that.
int putc ( int character, FILE * stream );
Writes a character to the stream and advances the position indicator.
So it is a more generic function than putchar
Other functions can be based on this e.g.
#define putchar(c) putc((c),stdout)
According to Kernighan's book putc
is equivalent with fputc
but putc
could be implemented as a macro and putc may have to evaluate its stream argument more than once.
I have read that supposedly that both exist for backward compatibility, but not sure if this is valid
It is so you have the option to output to a different stream such as a file.
fputc
and putc
are defined largely the same, except that putc
may be a macro which evaluates the stream paramter more than once. fputc
only evaluates the stream parameter once.
The difference between putc and fputc is that by using putc, you risk running the macro version which is inherently unsafe because it may have to evaluate its stream argument more than once. This causes complications that most people aren't aware of and thus do not watch out for, so fputc is better to use. fputc's macro does not have this problem.
putchar()
isn't just in MSVC - it's a standard C function (well, macro really).
精彩评论