警告:忽略 C 中‘fscanf’的 return 值

warning: ignoring return value of ‘fscanf’ in C

我在 C 中有以下代码:

(void)fscanf(fp, "%*d %*d %d %d %d\n",&z, &e, &a);

我调用了 void,因为 fscanf 的 return 值与我无关。但是我在编译时收到以下警告:

warning: ignoring return value of ‘fscanf’, declared with attribute warn_unused_result [-Wunused-result]
 (void)fscanf(fp, "%*d %*d %d %d %d\n",&z, &e, &a);

'(void)' 不应该取消该警告吗?

这是一个很好的警告,因为忽略 fscanf() 的 return 值可能会导致未定义的行为。我想除非您处理 return 值,否则您无法消除该警告,这很容易

if (fscanf(fp, "%*d%*d%d%d%d", &z, &e, &a) == 3)
    usevalues(z, e, a);
else
    reportproblem_do_not_use_z_e_or_a();

警告是如何正确使用函数的好老师,您永远不应忽略 fscanf() 的 return 值,更重要的是,您永远不应 ignore/silence 警告。如果编译器警告某些事情,那一定是因为你做错了什么1.

在这种情况下,如果您不检查值并继续使用 zea,则在读取它们时它们的内容可能未定义并且一些意想不到的事情会发生。

最糟糕的是,很难发现这些意想不到的事情(例如计算)正在发生,因为你没有检查 fscanf() 的 return 值。


1除非在极少数情况下,您故意做一些会触发警告的事情。但是只有当你是一个非常有经验的 程序员时才会出现这种情况。

这是为此属性定义的行为。当函数标有此属性时,return 值不能通过将其强制转换为 void 来忽略。

请参阅此 bug report 25009 进行有趣的讨论。

如果出现以下情况,您可以使用 noop 避免警告:

if (fscanf(fp, "%*d %*d %d %d %d\n",&z, &e, &a));