4

我遇到了这行代码:

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

请注意,该消息不包含任何 %-tag。

这在 Visual C++ 中安全吗?fflush() 成功返回 0,失败返回 EOF。fprintf() 将如何处理这个额外的参数?

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

4

3 回答 3

4

它是安全的。这是 C(至少 C99,第 7.19.6.1 段)所说的

如果格式已用尽而参数仍然存在,则应评估多余的参数,否则将被忽略。

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

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

如果只是为了防止以后阅读该代码的人用蝙蝠追捕我。

于 2011-01-20T17:22:58.960 回答
0

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

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

于 2011-01-20T15:40:22.703 回答
0

我认为 fprintf 正在使用 varargs 来处理参数,因此任何额外的参数都应该被安全地忽略(并不是说这是一个好的做法或任何东西)。你是对的,fflush 会在 fprintf 之前被调用,所以这是一种毫无意义的 hack。

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

于 2011-01-20T15:41:03.947 回答