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将理解它们,而不需要任何额外的切换。

09-30 16:59
查看更多