Безопасно ли использование Fflush (stdout) в качестве аргумента fprintf ()?

StackOverflow https://stackoverflow.com/questions/4749125

  •  13-10-2019
  •  | 
  •  

Вопрос

Я наткнулся на эту строку кода:

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

Обратите внимание, что сообщение не содержит никакого %-0.

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

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

Это было полезно?

Решение

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

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

Если бы целью было избежать линии, я бы предпочел сделать

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top