使用fflush(stdout)作为fprintf()参数安全吗?

时间:2011-01-20 15:36:47

标签: printf fflush

我遇到了这行代码:

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

请注意,该邮件不包含任何%-tag。

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

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

3 个答案:

答案 0 :(得分:4)

这很安全。这是什么C(C99至少,段落 7.19.6.1)说出来

  

如果格式用尽了   争论依旧,多余的论点   应进行评估,但不是   忽略。

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

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

如果只是为了防止此人后来阅读该代码,用蝙蝠打死我。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我认为fprintf正在使用varargs来处理参数,因此应该安全地忽略任何额外的参数(不是这是一个好的做法或任何事情)。你是对的,fflush将在fprintf之前被调用,所以这是一种毫无意义的黑客攻击。

启用了足够的警告标志(如-Wall for gcc),您将收到警告

相关问题