Question

To I came upon this line of code:

fprintf(stdout, "message", fflush(stdout));

Note that the message does not contain any %-tag.

Is that safe in visual c++? fflush() returns 0 on success and EOF on failure. What will fprintf() do with this extra parameter?

I first thought that this was a strange hack to add a fflush() call without needing an extra line. But written like this, the fflush() call will be executed before the fprintf() call so it does not flush the message being printed right now but the ones waiting to be flushed, if any... am I right?

Was it helpful?

Solution

It's safe. Here's what C (C99 atleast, paragraph 7.19.6.1) says about it

If the format is exhausted while arguments remain, the excess arguments shall be evaluated but are otherwise ignored.

If the goal was to avoid a line, i'd rather do

fflush(stdout); fprintf(stdout, "message");

if for nothing else than to prevent the person later reading that code to hunt me down with a bat.

OTHER TIPS

fprintf doesn't know the exact number of parameters, it only tries to load one argument per '%'. If you provide less arguments than '%', it results in undefined behavior, if you provide more arguments, they are ignored.

Ad second question, yes, this would only flush messages in queue, the new message won't be flushed.

I think fprintf is using varargs to process parameters, so any extra parameters should be safely ignored (not that it's a good practice or anything). And you are right that fflush will be called before fprintf, so this is kind of a pointless hack.

With enough warning flags enabled (like -Wall for gcc) you will get a warning

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top