Eclipse - 在printf()调用后将fflush(stdout)设置为默认值

时间:2014-01-23 11:07:07

标签: c eclipse gcc windows-7-x64

拥有same case

是否有任何解决方案,fflush(stdout)会在printf()之后自动发生,而不是在每次fflush(stdout)通话后添加printf()

我在Eclipse IDE for C/C++ Developers

上使用gcc --version gcc (GCC) 4.8.1windows 7

1 个答案:

答案 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无需任何额外的开关即可理解它们。