警告:忽略C中'fscanf'的返回值

时间:2015-12-10 00:24:34

标签: c warnings compiler-warnings scanf

我在C中有以下代码:

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

我将调用转换为void,因为fscanf的返回值与我无关。但是在编译时我收到以下警告:

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)'不应该发出警告吗?

3 个答案:

答案 0 :(得分:2)

这是一个很好的警告,因为忽略fscanf()的返回值可能会导致未定义的行为。我想你不能沉默那个警告,除非你处理返回值,这很容易

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()的返回值,更重要的是你永远不应该忽略/静音警告。如果编译器警告某事,那一定是因为你做错了 1

在这种情况下,如果您未检查该值并继续使用zea,则在阅读这些内容时可能会未定义其内容事情会发生。

最糟糕的是,很难发现,这些意想不到的事情(计算例如)正在发生,因为你 DID NOT CHECK {{1返回值。

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

答案 1 :(得分:2)

这是此属性的已定义行为。当使用此属性标记函数时,不能通过将其转换为void来忽略返回值。

有关有趣的讨论,请参阅此bug report 25009

答案 2 :(得分:1)

在以下情况下,您可以通过使用noop来避免警告

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