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

C语言 码拜 10年前 (2015-05-11) 1384次浏览 0个评论
//  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中的函数同名了,为什么不报错?

1分
参数不同,   或者在不同名字空间下
1分
math.h 里只是声明了fabs和sqrt函数,函数实现可以是数学库里的代码,也可以自己实现。
1分
这要看链接是导入那个库。
你试试关掉一个函数试试。
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语言有名字空间吗?

记得C语言有一个规定,就是允许用户自己编写与库函数同名的函数。
10分
用户调用标准库函数前不必重新定义,而只需使用预编译命令将该函数所在文件包括到用户源文件中即可。而且,系统允许用户重新定义标准库函数,但此时该函数将失去原有含义。
引用

系统允许用户重新定义标准库函数,但此时该函数将失去原有含义。

To Turntogo:
讲得有道理,请问有出处吗?

7分
函数sqrt和fabs跟函数main在同一个模块,在链接阶段,会优先选择同一个模块内的符号,sqrt和fabs会当作是指令段(.text)中的已定义的全局符号,相当于是静态链接这些函数名。#include <math.h>不会起作用。
模块中不定义sqrt和fabs时,sqrt会作为未定义的全局符号,在执行阶段被动态链接到模块中,#include <math.h>就起到了声明作用。
我忘了是在哪儿看到了,只是记得有这么回事,现在用度娘找到下面的网址,你可以看一下答案和解析:
http://www.ppkao.com/shiti/38173/

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明自定义函数与系统函数同名不报错,为什么?
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!