Безопасно ли использовать fflush (stdout) в качестве аргумента fprintf ()? - PullRequest
4 голосов
/ 20 января 2011

Чтобы я наткнулся на эту строку кода:

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

Обратите внимание, что в сообщении нет% -tag.

Это безопасно в Visual C ++? fflush () возвращает 0 в случае успеха и EOF в случае неудачи. Что fprintf () будет делать с этим дополнительным параметром?

Сначала я подумал, что это странный хак - добавить вызов fflush () без дополнительной строки. Но написано так, что вызов fflush () будет выполнен до вызова fprintf (), поэтому он не сбрасывает сообщение, которое печатается прямо сейчас, а сообщения, ожидающие очистки, если они есть ... я прав?

Ответы [ 3 ]

4 голосов
/ 20 января 2011

Это безопасно. Вот то, что C (C99 по крайней мере, абзац 7.19.6.1) говорит об этом

Если формат исчерпан во время аргументы остаются, лишние аргументы должны быть оценены, но в противном случае игнорироваться.

Если бы цель состояла в том, чтобы избежать линии, я бы лучше сделал

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

если только для того, чтобы человек, который позже читает этот код, не выслеживал меня летучей мышью

0 голосов
/ 20 января 2011

Я думаю, что fprintf использует varargs для обработки параметров, поэтому любые дополнительные параметры следует безопасно игнорировать (не то, что это хорошая практика или что-то в этом роде). И вы правы, что fflush будет вызываться до fprintf, так что это своего рода бессмысленный взлом.

При наличии достаточного количества флагов предупреждений (например, -Wall для gcc) вы получите предупреждение

0 голосов
/ 20 января 2011

fprintf не знает точное количество параметров, он пытается загрузить только один аргумент для «%».Если вы предоставите меньше аргументов, чем «%», это приведет к неопределенному поведению, если вы предоставите больше аргументов, они будут проигнорированы.

Второй вопрос объявления, да, это будет только сбрасывать сообщения в очереди, новое сообщение получитне быть покрасневшим

...