我遇到了这行代码:
fprintf(stdout, "message", fflush(stdout));
请注意,该邮件不包含任何%-tag。
在visual c ++中这是安全的吗? fflush()在成功时返回0,在失败时返回EOF。 fprintf()会对这个额外的参数做什么?
我首先想到这是一个奇怪的黑客添加fflush()调用而不需要额外的行。但是这样编写,fflush()调用将在fprintf()调用之前执行,因此它不会刷新正在打印的消息,而是等待刷新的消息,如果有的话......我是对的吗?
答案 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),您将收到警告