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

问题描述 投票:2回答:3

我在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)'是否应该取消该警告?

c warnings compiler-warnings scanf
3个回答
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

在这种情况下,如果您不检查该值并继续使用zea,则它们的内容在读取之时可能是不确定的,并且会发生意外情况。

最糟糕的部分是,由于您DID NOT CHECK fscanf()的返回值,很难发现这些意外的情况(例如计算)正在发生。


1

极少数情况下,您有意执行某些操作会触发警告。但是,只有当您是一位经验丰富的程序员时,才会发生这种情况。

2
投票

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


0
投票

如果发生以下情况,您可以通过使用noop来避免警告:

© www.soinside.com 2019 - 2024. All rights reserved.