在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