我在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
,则它们的内容在读取之时可能是不确定的,并且会发生意外情况。
最糟糕的部分是,由于您DID NOT CHECK fscanf()
的返回值,很难发现这些意外的情况(例如计算)正在发生。
1
极少数情况下,您有意执行某些操作会触发警告。但是,只有当您是一位经验丰富的c程序员时,才会发生这种情况。这是为此属性定义的行为。当一个函数标记有该属性时,不能通过将其强制转换为void来忽略返回值。
如果发生以下情况,您可以通过使用noop来避免警告: