在Visual Studio 2013中编译C程序时,以下内容可能会产生不同的结果:

#include <math.h>

void bar(void) {
    double f = fabs(-1.0);
    /* f is 1.0 */
}


void foo(void) {
    double f = fabs(-1.0);
    /* f is 0 */
}

在省略include时,编译器不会报告错误,并假设fabs具有以下签名int fabs()
有没有强制编译器将其报告为错误或警告?

最佳答案

在旧的C标准中,默认情况下,如果没有声明,函数将具有返回类型int,因此如果不包含math.h,编译器将假定fabs返回int,这就是您看到结果的原因。打开所有警告,您将看到有关隐式返回类型的内容
在VS2013中,即使没有提高警告级别,我也收到了以下警告

Warning 1   warning C4013: 'fabs' undefined; assuming extern returning int

10-04 21:05