拥有same case。
是否有任何解决方案,fflush(stdout)
会在printf()
之后自动发生,而不是在每次fflush(stdout)
通话后添加printf()
?
我在Eclipse IDE for C/C++ Developers
gcc --version gcc (GCC) 4.8.1
和windows 7
答案 0 :(得分:4)
如果要全局禁用缓冲,可以使用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中标准化。不过,GCC 4.8无需任何额外的开关即可理解它们。