警告:忽略返回值‘;fscanf’;在C中

警告:忽略返回值‘;fscanf’;在C中,c,warnings,compiler-warnings,scanf,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

我有以下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)”不应该删除该警告吗?

这是一个很好的警告,因为忽略
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
,则在读取它们时,它们的内容可能未定义,并且会发生一些意外情况

最糟糕的是,由于没有检查
fscanf()
的返回值,很难发现这些意外的事情(例如计算)正在发生



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

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


有关有趣的讨论,请参阅此部分。

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

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

否,因为属性“warn\u unused\u result”已放置在头文件的函数原型中。这意味着一个更有经验的程序员会毫不含糊地告诉你,来自
fscanf
的返回值从来都不是无关的。我喜欢从不无关的。我确信你意识到你有比变量更多的说明符。@bruceg不,只有3个存储值的说明符。另2个
%*d
解析各自的值,但由于
*
修饰符,因此禁止赋值。忽略返回值如何导致未定义的行为?因为
z
e
a
可能不是由
fscanf()
初始化的,因此,读取它们将是未定义的行为,因为它们的内容未定义。但这与忽略返回值无关。确实如此,因为如果忽略
fscanf()
的返回值(不是任何函数,但忽略任何函数的返回值无论如何都是不好的)然后,除非在调用
fscanf()
之前显式初始化它们,否则您无法确定是否初始化了
z
e
a
。返回值告诉您有多少项成功匹配和分配。有一个可能的错误条件,但没有未定义的行为。卓越链接,讨论也很好。因此,只需使用
-Wno unused result
,这是GCC人员的建议。这是否会触发一个警告,提示
if
后面有一个分号?我不喜欢这段代码,它很难理解,很容易导致误解。毫无疑问,你回答了这个问题。我还是不喜欢这个答案。清除警告不能降低代码质量!