// 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语言有一个规定,就是允许用户自己编写与库函数同名的函数。
|
|
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/ |