我在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)'不应该发出警告吗?
答案 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 。
在这种情况下,如果您未检查该值并继续使用z
,e
或a
,则在阅读这些内容时可能会未定义其内容事情会发生。
最糟糕的是,很难发现,这些意想不到的事情(计算例如)正在发生,因为你 DID NOT CHECK {{1返回值。
1 除非在极少数情况下,您故意做一些会触发警告的事情。但是,只有当你是一位非常有经验的c程序员时,才会发生这种情况。
答案 1 :(得分:2)
这是此属性的已定义行为。当使用此属性标记函数时,不能通过将其转换为void来忽略返回值。
有关有趣的讨论,请参阅此bug report 25009。
答案 2 :(得分:1)
在以下情况下,您可以通过使用noop来避免警告
:if (fscanf(fp, "%*d %*d %d %d %d\n",&z, &e, &a));