当自定义尾数与库函数同名时,一般的调用是自定义函数优先,但标准库函数并不失去意义,只是调用方式要有所改变:即用::打头则调用库函数,直接写函数名则调用自定义函数。下面代码可以佐证——
#include "stdio.h"
void printf(void){
puts("12345");
}
int main(int argv,char *argc[]){
::printf("abc\n");//用::打头调用库函数printf
printf();//直接调用则默认自定义函数
return 0;
}
运行结果如下:
不是失去原有意义,是在你定义的范围内,以你定义的这个同名函数为主
相当于,你定义了一个全局变量,可是,在某个函数内,定义了一个同名的局部变量,在局部变量作用的范围内,以局部变量为主。
首先题主这句话当然是对的。我来说下包含头文件的情况吧,先上正确结论:
“用户可以重新定义标准库函数,若重新定义,该函数将失去原有含义”。
如:
#include
#include
double fabs(double x) //绝对值函数,这个函数与math.h中的fabs函数同名
{
if (x >= 0.0)
return x;
else
return -x;
}
double sqrt(double a) //开平方函数,这个函数与math.h中的sqrt函数同名
{
double x1, x2;
x1 = a / 2.0;
x2 = (x1 + a / x1) / 2.0;
while (fabs(x2 - x1)>1e-6)
{
x1 = x2;
x2 = (x1 + a / x1) / 2.0;
}
return x1;
}
int main()
{
double x = 3.0;
printf("%.6lf\n", sqrt(x));
return 0;
}
上述代码正常运行。要注意的是:用户可以重新定义标准库函数,若重新定义,该函数将失去原有含义。
但定义必须和math.h中声明保持一致。如:
double fabs(double x) //绝对值函数,这个函数与math.h中的fabs函数同名
{
if (x >= 0.0)
return x;
else
return -x;
}
修改为:
int fabs(double x) //绝对值函数,这个函数与math.h中的fabs函数同名
{
if (x >= 0.0)
return x;
else
return -x;
}
就会报错了。