为什么在不检查返回值的情况下调用返回值的函数?

时间:2019-03-07 17:27:57

标签: c function

我的意思是不将其值分配给变量,而是使用它。

例如:

int foo(void);
void main()
{
    foo();
}
int foo()
{
    return(5);
}

为什么我不能收到任何警告

2 个答案:

答案 0 :(得分:7)

许多函数返回一个值并执行副作用,但是它们通常仅用于副作用。

例如,printf()打印输出,还返回打印的字符数。但是大多数情况下,返回值并不有趣,因此我们不会在任何地方分配它。 fclose()返回成功指示符,但是如果程序失败,通常是无能为力,因此他们不必费心检查结果。

不得不写类似这样的东西很繁琐

(void)printf(...);
(void)fclose(f);

一直如此,因此编译器通常不会警告不使用结果而调用非void函数。

在某些情况下这可能是个问题。在某些函数中,您确实应该使用返回值,但是不使用它通常是一个错误。例如,realloc()返回新指针,但是许多初学者只是假设它将始终调整旧指针指向的分配大小。

一些IDE可能为此列出了应警告的功能列表。但是编译器通常不那么精确。

答案 1 :(得分:3)

如果您不想存储或检查从函数返回的值,则没有义务。

例如,printf返回一个int,代表成功写入的字符数,但是在大多数情况下,您只是调用printf在屏幕上产生输出;您不在乎返回值。例如:

printf("Hello World!\n");

比以下情况普遍得多:

if(printf("Hello World!\n") != 13)
    // printf failed

也就是说,有很多静态分析工具可以强制调用某些函数的代码必须检查其返回值。我最熟悉的SAL允许您使用_Check_return__Must_inspect_result_注释一个函数,如果您随后调用这样注释的函数而不检查其返回值,则进行分析将报告警告。

示例:

_Must_inspect_result_
int foo()
{
    return 5;
}

int main(void)
{
    foo();
    return 0;
}

对此代码运行SAL分析会产生警告消息:

  

C6031返回值被忽略:'foo'。