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

Spe*_*men 4 c warnings scanf compiler-warnings

我在 C 中有以下代码:

(void)fscanf(fp, "%*d %*d %d %d %d\n",&z, &e, &a);
Run Code Online (Sandbox Code Playgroud)

我将调用转换为 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);
Run Code Online (Sandbox Code Playgroud)

'(void)' 不应该消除那个警告吗?

Iha*_*imi 6

这是一个很好的警告,因为忽略 的返回值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();
Run Code Online (Sandbox Code Playgroud)

警告是如何正确使用函数的好老师,你永远不应该忽略fscanf()的返回值,更重要的是你永远不应该忽略/沉默警告。如果编译器对某事发出警告,那一定是因为您做错了1

在这种情况下,如果您不检查该值并继续使用ze否则a在阅读它们的那一刻它们的内容可能是未定义的,并且会发生一些意想不到的事情。

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


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