自定义函数与系统函数同名不报错,为什么?

qjzsj 2015-05-05 10:20:15

// test.c
#include<stdio.h>
#include<math.h>

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;
}


上面这个程序在VC6下竟然能成功运行!不理解与math.h中的函数同名了,为什么不报错?
...全文
876 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
啊大1号 2018-07-04
  • 打赏
  • 举报
回复
引用 11 楼 a3192048 的回复:
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;
}
你用C编译器就会编译报错了。

用户可以重新定义标准库函数,若重新定义,该函数将失去原有含义。
但定义必须和math.h中声明保持一致。
啊大1号 2018-07-04
  • 打赏
  • 举报
回复
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;
}
你用C编译器就会编译报错了。
hunancjz 2016-11-22
  • 打赏
  • 举报
回复
函数库的基本原则,用户函数优先。
lraining 2015-05-08
  • 打赏
  • 举报
回复
函数sqrt和fabs跟函数main在同一个模块,在链接阶段,会优先选择同一个模块内的符号,sqrt和fabs会当作是指令段(.text)中的已定义的全局符号,相当于是静态链接这些函数名。#include <math.h>不会起作用。 模块中不定义sqrt和fabs时,sqrt会作为未定义的全局符号,在执行阶段被动态链接到模块中,#include <math.h>就起到了声明作用。
星光伴月 2015-05-08
  • 打赏
  • 举报
回复
我忘了是在哪儿看到了,只是记得有这么回事,现在用度娘找到下面的网址,你可以看一下答案和解析: http://www.ppkao.com/shiti/38173/
qjzsj 2015-05-07
  • 打赏
  • 举报
回复
引用
系统允许用户重新定义标准库函数,但此时该函数将失去原有含义。
To Turntogo: 讲得有道理,请问有出处吗?
星光伴月 2015-05-07
  • 打赏
  • 举报
回复
用户调用标准库函数前不必重新定义,而只需使用预编译命令将该函数所在文件包括到用户源文件中即可。而且,系统允许用户重新定义标准库函数,但此时该函数将失去原有含义。
星光伴月 2015-05-07
  • 打赏
  • 举报
回复
记得C语言有一个规定,就是允许用户自己编写与库函数同名的函数。
qjzsj 2015-05-06
  • 打赏
  • 举报
回复
to Saleayas:

//  test.c
#include<stdio.h>
#include<math.h>

/*
double fabs(double x)	//绝对值函数,这个函数与math.h中的fabs函数同名
{
	if(x >= 0.0)
		return x;
	else
		return -x;
}
*/

double sqrt(double x)	//开平方函数,这个函数与math.h中的sqrt函数同名
{
	double x1, x2;
	x1 = x/2.0;
	x2 = (x1 + x/x1)/2.0;
	while(fabs(x2-x1)>1e-6)
	{
		x1 = x2;
		x2 = (x1 + x/x1)/2.0;
	}
	return x1;
}

int main()
{
	double x = 3.0;
	printf("%.6lf\n", sqrt(x));
	return 0;
}
仍然能成功运行。也就是fabs函数来自math库,sqrt来自自定义函数,怎么就不冲突呢? to mymtom: 有点感觉,但不太理解。 to focuslight: 函数原型是相同的,这一次的程序也修改了参数。 C语言有名字空间吗?
Saleayas 2015-05-06
  • 打赏
  • 举报
回复
这要看链接是导入那个库。 你试试关掉一个函数试试。
mymtom 2015-05-06
  • 打赏
  • 举报
回复
math.h 里只是声明了fabs和sqrt函数,函数实现可以是数学库里的代码,也可以自己实现。
Isnis-fallen 2015-05-06
  • 打赏
  • 举报
回复
参数不同, 或者在不同名字空间下

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧