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

发布于 2024-10-13 22:41:52 字数 318 浏览 8 评论 0原文

我发现了这行代码:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

黎夕旧梦 2024-10-20 22:41:52

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.

纵性 2024-10-20 22:41:52

很安全。这是 C 的内容(至少 C99,段落
7.19.6.1) 说的

如果格式已用完
争论仍然存在,多余的争论
应进行评估,但否则
被忽略。

如果目标是避免排队,我宁愿

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

这样做,也不愿阻止其他人稍后阅读该代码并用球棒追捕我。

It's safe. Here's what C (C99 atleast, paragraph
7.19.6.1) says about it

If the format is exhausted while
arguments remain, the excess arguments
shall be evaluated but are otherwise
ignored.

If the goal was to avoid a line, i'd rather do

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

if for nothing else than to prevent the person later reading that code to hunt me down with a bat.

枫林﹌晚霞¤ 2024-10-20 22:41:52

我认为 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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文