当前位置: 技术问答>linux和unix
为什么没有数学头文件,也能运行?
来源: 互联网 发布时间:2015-08-14
本文导语: 我在GCC下运行一个程序,调用一下函数 我屏蔽掉了头文件,但是编译也能通过,为什么,到运行的时候,别的函数调用该函数后,生成的返回值无论输入x,y是多少return 都为1,我没有定义math.h的头文件,为什么 编译...
我在GCC下运行一个程序,调用一下函数
我屏蔽掉了头文件,但是编译也能通过,为什么,到运行的时候,别的函数调用该函数后,生成的返回值无论输入x,y是多少return 都为1,我没有定义math.h的头文件,为什么 编译时没有告诉pow未定义呢?
#include "compute.h"
//#include
double compute(double x, double y)
{
return (pow((double) x,(double)y));
}
我屏蔽掉了头文件,但是编译也能通过,为什么,到运行的时候,别的函数调用该函数后,生成的返回值无论输入x,y是多少return 都为1,我没有定义math.h的头文件,为什么 编译时没有告诉pow未定义呢?
#include "compute.h"
//#include
double compute(double x, double y)
{
return (pow((double) x,(double)y));
}
|
c语言里面,所有的函数都可以不申明就直接使用的,在这种情况下,编译器会认为函数的返回值是整数。
也就是说,去掉头文件math.h以后,下面的代码
double compute(double x, double y)
{
return (pow((double) x,(double)y));
}
编译还是可以通过,只是编译器认为pow函数会返回整数,所以在ia32下面,它就会将寄存器eax里面的值返回(估计pow函数运行完以后eax里面的值正好是1)。
但是实际上,pow函数是返回double型的,它的真正的值在浮点寄存器里面。
也就是说,去掉头文件math.h以后,下面的代码
double compute(double x, double y)
{
return (pow((double) x,(double)y));
}
编译还是可以通过,只是编译器认为pow函数会返回整数,所以在ia32下面,它就会将寄存器eax里面的值返回(估计pow函数运行完以后eax里面的值正好是1)。
但是实际上,pow函数是返回double型的,它的真正的值在浮点寄存器里面。
|
可能GCC默认包含了一些文件。
或别的头文件中包含了 MATH.H
或别的头文件中包含了 MATH.H