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)' 不应该消除那个警告吗?
这是一个很好的警告,因为忽略 的返回值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。
在这种情况下,如果您不检查该值并继续使用z,e否则a在阅读它们的那一刻它们的内容可能是未定义的,并且会发生一些意想不到的事情。
最糟糕的是,很难发现这些意外的事情(例如计算)正在发生,因为您没有检查 CHECK fscanf()的返回值。
1除非在极少数情况下,您故意做一些会触发警告的事情。但是只有当你是一个非常有经验的c程序员时才会发生这种情况。