4

私はこのコード行に出くわしました:

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

メッセージには%タグが含まれていないことに注意してください。

Visual C ++では安全ですか?fflush()は、成功した場合は0を返し、失敗した場合はEOFを返します。fprintf()はこの追加のパラメーターで何をしますか?

私は最初、これは余分な行を必要とせずにfflush()呼び出しを追加するための奇妙なハックだと思いました。しかし、このように書くと、fflush()呼び出しはfprintf()呼び出しの前に実行されるので、現在印刷されているメッセージはフラッシュされませんが、フラッシュされるのを待っているメッセージがあれば...私は正しいですか?

4

3 に答える 3

4

安全です。これがC(少なくともC99、段落7.19.6.1)がそれについて言っていることです

引数が残っている間にフォーマットが使い果たされた場合、余分な引数は評価されますが、それ以外の場合は無視されます。

目標が線を避けることだった場合、私はむしろしたい

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

後でその人がそのコードを読んでコウモリで私を追い詰めるのを防ぐ以外に何もありません。

于 2011-01-20T17:22:58.960 に答える
0

fprintfパラメータの正確な数はわかりません。'%'ごとに1つの引数をロードしようとします。'%'より少ない引数を指定すると、未定義の動作になります。より多くの引数を指定すると、それらは無視されます。

2番目の質問です。はい、これはキュー内のメッセージのみをフラッシュします。新しいメッセージはフラッシュされません。

于 2011-01-20T15:40:22.703 に答える
0

fprintfはvarargsを使用してパラメーターを処理していると思うので、余分なパラメーターは無視しても問題ありません(これは良い習慣などではありません)。そして、fprintfの前にfflushが呼び出されるのは正しいので、これは一種の無意味なハックです。

十分な警告フラグを有効にすると(gccの-Wallなど)、警告が表示されます

于 2011-01-20T15:41:03.947 に答える