2014-01-23 28 views

回答

4

使用Eclipse IDE for C/C++ Developersgcc --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會理解它們,不需要任何額外的開關。

+0

刪除宏定義後的最後一個';'。另外,值得指出的是可變參數宏是C99的一個特性。 – unwind

+0

謝謝@unwind,添加到答案,有一點額外的獎金。在我的代碼中,我寧願保留尾部的';':它是多餘的,但它不會損害和防止在宏後省略';'後的愚蠢錯誤(我經常這樣做,大多數情況下,如果寫入IN_CALL_CAPS)。我有興趣知道爲什麼你認爲我應該放棄它:) –

+0

我絕不會推薦(或使用)第一種形式,沒有'do' /'while',因爲如果用作沒有大括號的語句, if(foo)printflush(「blah」); else printflush(「whatever」);'不符合你的期望)。我認爲空聲明有點​​不衛生,我認爲有些編譯器甚至提出警告,所以我不會包含它。 – unwind