1
擁有same case。Eclipse - 在調用printf()後調用fflush(stdout)爲
是否有任何解決方案,使得fflush(stdout)
將printf()
後自動發生,而不是每個printf()
調用之後添加fflush(stdout)
?在程序的開始
setvbuf(stdout, NULL, _IONBF, 0);
:
我對windows 7
擁有same case。Eclipse - 在調用printf()後調用fflush(stdout)爲
是否有任何解決方案,使得fflush(stdout)
將printf()
後自動發生,而不是每個printf()
調用之後添加fflush(stdout)
?在程序的開始
setvbuf(stdout, NULL, _IONBF, 0);
:
我對windows 7
使用Eclipse IDE for C/C++ Developers
和gcc --version gcc (GCC) 4.8.1
如果你想全局禁用緩存,您可以使用setvbuf
。
如果你想這樣做只爲幾個電話,你可以定義自己的宏這樣做,如:
#define printflush(s, ...) do { printf(s, __VA_ARGS__); fflush(stdout); } while (0)
這使一招新範圍內的兩個函數調用。
在這兩種情況下,您都需要至少有兩個參數(如printflush("id = %d\n", id)
),否則在編譯時會導致語法錯誤。
GCC具體的解決方案上面問題:你可以擴展上面,以便它有太多的單個參數工作的宏:
#define printflush(s, ...) do { printf(s, ##__VA_ARGS__); fflush(stdout); } while (0)
這樣,您就可以與printflush("Hey!")
也用它。
編輯:正如@unwind所指出的,可變參數宏已經在C99中標準化了。不過,GCC 4.8會理解它們,不需要任何額外的開關。
刪除宏定義後的最後一個';'。另外,值得指出的是可變參數宏是C99的一個特性。 – unwind
謝謝@unwind,添加到答案,有一點額外的獎金。在我的代碼中,我寧願保留尾部的';':它是多餘的,但它不會損害和防止在宏後省略';'後的愚蠢錯誤(我經常這樣做,大多數情況下,如果寫入IN_CALL_CAPS)。我有興趣知道爲什麼你認爲我應該放棄它:) –
我絕不會推薦(或使用)第一種形式,沒有'do' /'while',因爲如果用作沒有大括號的語句, if(foo)printflush(「blah」); else printflush(「whatever」);'不符合你的期望)。我認爲空聲明有點不衛生,我認爲有些編譯器甚至提出警告,所以我不會包含它。 – unwind