C语言: 若不包含相应头文件,程序员可以定义与标准库函数同名的用户自定义函数,若如此,该函数将失去

C语言: 若不包含相应头文件,程序员可以定义与标准库函数同名的用户自定义函数,若如此,该函数将失去原有意义,对不对,理由

当自定义尾数与库函数同名时,一般的调用是自定义函数优先,但标准库函数并不失去意义,只是调用方式要有所改变:即用::打头则调用库函数,直接写函数名则调用自定义函数。下面代码可以佐证——

#include "stdio.h"
void printf(void){
puts("12345");
}
int main(int argv,char *argc[]){
::printf("abc\n");//用::打头调用库函数printf
printf();//直接调用则默认自定义函数
return 0;
}

运行结果如下:

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-11-09
不是失去原有意义,是在你定义的范围内,以你定义的这个同名函数为主

相当于,你定义了一个全局变量,可是,在某个函数内,定义了一个同名的局部变量,在局部变量作用的范围内,以局部变量为主。追问

用#include包含的头文件的后缀不可以是“.a”

追答

除非你自己建立一个.a的文件

理论上,#include可以包含任意类型的文件到程序中来,当然了,最常见的是头文件.h

本回答被提问者和网友采纳
第2个回答  2018-07-04

首先题主这句话当然是对的。我来说下包含头文件的情况吧,先上正确结论:

“用户可以重新定义标准库函数,若重新定义,该函数将失去原有含义”。

如:

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

上述代码正常运行。要注意的是:用户可以重新定义标准库函数,若重新定义,该函数将失去原有含义。
但定义必须和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;
}

就会报错了。