2011-01-20 71 views
4

要我来到这行代码:使用fflush(stdout)作为fprintf()参数安全吗?

fprintf(stdout, "message", fflush(stdout)); 

注意该消息不包含任何% - 标签。

在visual C++中安全吗? fflush()在成功时返回0,在失败时返回EOF。 fprintf()会用这个额外的参数做什么?

我首先想到,这是一个奇怪的黑客添加fflush()调用,而不需要额外的行。但是,像这样写,fflush()调用将在fprintf()调用之前执行,因此它不会刷新正在打印的消息,而是等待被刷新的消息,如果有的话......我是对的吗?

回答

4

它的安全。这里是C(C99 ATLEAST款 7.19.6.1)称,它

如果在 参数保持格式耗尽, 应当评估,但过剩的论点,否则 忽略。

如果目标是避免一条线,我宁愿做

fflush(stdout); fprintf(stdout, "message"); 

如果没有别的比,以防止人后来读取代码追捕我失望了蝙蝠。

0

fprintf不知道参数的确切数量,它只会尝试每个'%'加载一个参数。如果您提供的参数少于'%',则会导致未定义的行为,如果您提供更多参数,则会被忽略。

第二个问题,是的,这只会刷新队列中的消息,新消息不会被刷新。

0

我认为fprintf使用可变参数来处理参数,所以任何额外的参数都应该被安全地忽略(这不是一个好的做法或任何其他的)。你说得对,fflush会在fprintf之前被调用,所以这是一种毫无意义的黑客行为。

启用(如Wall来GCC)足够的警告标志,你会得到一个警告