有same case的。
是否有任何解决方案可以使fflush(stdout)
在每次printf()
调用后自动发生而不是添加fflush(stdout)
?
我使用printf()
和Eclipse IDE for C/C++ Developers
打开gcc --version gcc (GCC) 4.8.1
最佳答案
如果要全局禁用缓冲,可以使用setvbuf
:
setvbuf(stdout, NULL, _IONBF, 0);
在程序开始时。
如果只想对某些调用执行此操作,可以定义自己的宏来执行此操作,例如:
#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中标准化。不过,GCC4.8将理解它们,而不需要任何额外的切换。