2011-01-20 51 views
4

要我來到這行代碼:使用fflush(stdout)作爲fprintf()參數安全嗎?

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

注意該消息不包含任何% - 標籤。

在visual C++中安全嗎? fflush()在成功時返回0,在失敗時返回EOF。 fprintf()會用這個額外的參數做什麼?

我首先想到,這是一個奇怪的黑客添加fflush()調用,而不需要額外的行。但是,像這樣寫,fflush()調用將在fprintf()調用之前執行,因此它不會刷新正在打印的消息,而是等待被刷新的消息,如果有的話......我是對的嗎?

回答

4

它的安全。這裏是C(C99 ATLEAST款 7.19.6.1)稱,它

如果在 參數保持格式耗盡, 應當評估,但過剩的論點,否則 忽略。

如果目標是避免一條線,我寧願做

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

如果沒有別的比,以防止人後來讀取代碼追捕我失望了蝙蝠。

0

fprintf不知道參數的確切數量,它只會嘗試每個'%'加載一個參數。如果您提供的參數少於'%',則會導致未定義的行爲,如果您提供更多參數,則會被忽略。

第二個問題,是的,這隻會刷新隊列中的消息,新消息不會被刷新。

0

我認爲fprintf使用可變參數來處理參數,所以任何額外的參數都應該被安全地忽略(這不是一個好的做法或任何其他的)。你說得對,fflush會在fprintf之前被調用,所以這是一種毫無意義的黑客行爲。

啓用(如Wall來GCC)足夠的警告標誌,你會得到一個警告

相關問題