使用 fflush(stdout) 作为 fprintf() 参数安全吗?
我发现了这行代码:
fprintf(stdout, "message", fflush(stdout));
请注意,该消息不包含任何%标签。
这在 Visual C++ 中安全吗? fflush() 成功时返回 0,失败时返回 EOF。 fprintf() 将用这个额外的参数做什么?
我首先认为这是一个奇怪的技巧,无需额外的行即可添加 fflush() 调用。但这样写, fflush() 调用将在 fprintf() 调用之前执行,因此它不会刷新正在打印的消息,而是刷新等待刷新的消息(如果有的话)......我对吗?
To I came upon this line of code:
fprintf(stdout, "message", fflush(stdout));
Note that the message does not contain any %-tag.
Is that safe in visual c++? fflush() returns 0 on success and EOF on failure. What will fprintf() do with this extra parameter?
I first thought that this was a strange hack to add a fflush() call without needing an extra line. But written like this, the fflush() call will be executed before the fprintf() call so it does not flush the message being printed right now but the ones waiting to be flushed, if any... am I right?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
fprintf
不知道参数的确切数量,它只尝试为每个“%”加载一个参数。如果您提供的参数少于“%”,则会导致未定义的行为,如果您提供的参数较多,它们将被忽略。第二个问题,是的,这只会刷新队列中的消息,新消息不会被刷新。
fprintf
doesn't know the exact number of parameters, it only tries to load one argument per '%'. If you provide less arguments than '%', it results in undefined behavior, if you provide more arguments, they are ignored.Ad second question, yes, this would only flush messages in queue, the new message won't be flushed.
很安全。这是 C 的内容(至少 C99,段落
7.19.6.1) 说的
如果目标是避免排队,我宁愿
这样做,也不愿阻止其他人稍后阅读该代码并用球棒追捕我。
It's safe. Here's what C (C99 atleast, paragraph
7.19.6.1) says about it
If the goal was to avoid a line, i'd rather do
if for nothing else than to prevent the person later reading that code to hunt me down with a bat.
我认为 fprintf 使用 varargs 来处理参数,因此任何额外的参数都应该被安全地忽略(并不是说这是一个好的做法或任何东西)。你是对的,fflush 将在 fprintf 之前被调用,所以这是一种毫无意义的黑客行为。
如果启用了足够的警告标志(例如 gcc 的 -Wall),您将收到警告
I think fprintf is using varargs to process parameters, so any extra parameters should be safely ignored (not that it's a good practice or anything). And you are right that fflush will be called before fprintf, so this is kind of a pointless hack.
With enough warning flags enabled (like -Wall for gcc) you will get a warning