h函数c语言 c语言之函数

如何在c语言中定义函数在.h文件,和在新文件中使用

额,书上都有吧。

创新互联建站-专业网站定制、快速模板网站建设、高性价比绥滨网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式绥滨网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖绥滨地区。费用合理售后完善,十余年实体公司更值得信赖。

一般来说,头文件(.h)都包含了一些常用的而且已经通过了测试证明其运行正确的函数,

在自己的程序中用#include引用这些头文件,直接使用其中一些已经写好的函数,就省去

了很多麻烦,提高了代码的重用性。例如我们常常在程序中写下 #include stdio.h 语

句,以使用头文件 stdio.h 中的函数,比如说printf函数。可是该如何写自己的头文件,

以让自己的函数能被再次使用呢?

也许有同学会想,真接把自己的函数声明与定义移到.h文件里就可以了。就如下面的做法:

在工程里建好main.c后,再建一个点utils.h文件,把常用的函数如mean()放这里。

// file name : utils.h

// version : 1

doublemean(double, double); //求两个数的均值

doublemean(double a, double b)

{

return (a+b)/2.0;

}

// file name : main.c

// version : 1

#includestdio.h

#include"utils.h"

intmain()

{

double a,b,avg;

a = 1.0;

b = 3.0;

avg = mean(a,b); //调用utils.h里的mean函数

printf("%lf\n", avg);

return0;

}

以上的代码是可以编译通过的,并运行正确的。但是,这样的代码并不完善。如果

再写一个头文件other.h,而other.h又引用了utils.h的mean()函数,这时就会出

问题:

// file name : utils.h

// version : 1

doublemean(double, double); //求两个数的均值

doublemean(double a, double b)

{

return (a+b)/2.0;

}

// file name : other.h

// version : 1

#include"utils.h" //引用 utils.h

doublemean4(double, double, double, double);

doublemean4(double a, double b, double c, double d)

{

returnmean(mean(a,b), mean(c,d)); // 调用了 utils.h 里的 mean 函数

}

// file name : main.c

// version : 2

// 增加了对other.h的引用

#includestdio.h

#include"utils.h"

#include"other.h"

intmain()

{

double a,b,c,d,avg;

a = 1.0;

b = 3.0;

c = 4.0;

d = 2.0;

avg = mean(a,b); //调用utils.h里的mean函数

printf("%lf\n", avg);

avg = mean4(a,b,c,d); //调用other.h里的mean4函数

printf("%lf\n", avg);

return0;

}

而此时,编译就不能通过了,并出现如下的错误信息:

utils.h:9: Error: 'mean'is already defined

究其原因就是,函数的声明可以在程序中写多次,但函数定义只能有一个。main.c引用了

utils.h文件,因此main.c里会有一个mean()函数的声明,而other.h里也引用了utils.h

文件,所以又有一个mean()函数的声明。

main.c -- utils.h 第一个mean()

-- other.h -- utils.h 第二个mean()

历史原因,C/C++编译器不能将这样相同的重复声明区别开,所以必须通过其它的方法使得工程

里,mean()只被声明一次。一般来说,都是通过#ifndef/#define/#endif宏命令组合来实现避免

重复声明的。修改后的代码如下:

//file name : utils.h

//version 2

#ifndef UTILS_H_INCLUDED // 如果没有定义标识符

// UTILS_H_INCLUDED,则

// 继续编译下面的代码,

// 直到 #endif

#define UTILS_H_INCLUDED // 定义标识符 UTILS_H_INCLUDED

doublemean(double, double);

doublemean(double a, double b)

{

return (a+b)/2.0;

}

#endif// UTILS_H_INCLUDED

其它代码都同前。#ifndef/#endif 就像 if(!(...)) {} 一样,让编译器明白,如果没有定义标

识符UTILS_H_INCLUDED,就包含下面的代码,直到#endif;否则,到#endif为止的代码就不被包

含到文件里。#define表示定义一个标识符(不一定要赋值给这个标识符)。

当main.c引用utils.h时,由于UTILS_H_INCLUDED没被定义,所以#ifndef与#endif之间的代码都

会被main.c包含,所以 #define 语句会被执行,定义一个UTILS_H_INCLUDED标识符,同时工程里

也有了一个mean()函数的定义;当main.c引用other.h时,other.h里对utils.h的引用并不会再次

定义mean(),因为UTILS_H_INCLUDED已经被定义了,通过#ifndef/#endif的控制作用,虽然other.h

引用了utils.h,但引用的头文件并没有包含mean()的声明,自然就不会再引起重复定义的错误,

编译就能通过了。

基于相同的道理,所有的.h文件,都应该加入#ifndef/#define/#endif的组合,以使头文件都能

重复利用而不引起重复定义的错误。例子中的other.h文件也应如此,这里就留给同学自己添加了。

参考网址:

c语言中的 math.h 数学函数库

一些数学计算的公式的具体实现是放在math.h里,具体有:

double sin (double x); x的正弦值

double cos (double x); x的余弦值

double tan (double x); x的正切值

double asin (double x); 结果介于[-PI/2, PI/2],x值域为[-1,1]

double acos (double x); 结果介于[0, PI],x值域为[-1,1]

double atan (double x); 反正切(主值), 结果介于[-PI/2, PI/2]

double atan2 (double y, double x); 反正切(整圆值), 结果介于[-PI, PI]

double sinh (double x); x的双曲正弦值

double cosh (double x); x的双曲余弦值

double tanh (double x); x的双曲正切值

double exp (double x); 幂函数e^x

double pow (double x, double y); x^y,如果x=0且y=0,或者x0且y不是整型数,将产生定义域错误

double sqrt (double x); x的平方根,其中x=0

double log (double x); 以e为底的对数,自然对数,x0

double log10 (double x); 以10为底的对数,x0

double ceil (double x); 取上整

double floor (double x); 取下整

double fabs (double x); x的绝对值

double frexp (double x, int *exp); 标准化浮点数, x = f * 2^exp, 已知x求f, exp ( x介于[0.5, 1] )并返回f值

double ldexp (double x, int exp); 与frexp相反, 已知x, exp求x*2^exp

double modf (double x, double *ip); 将参数的整数部分通过指针回传, 返回小数部分,整数部分保存在*ip中

double fmod (double x, double y); 返回两参数相除x/y的余数,符号与x相同。如果y为0,则结果与具体的额实现有关

C语言 写个strcpyh函数

#include stdio.h

#include string.h

char* StrCpy(char *strDest, const char *strSrc)

{

if(!strDest||!strSrc)

return NULL;

if (!strlen(strSrc))

{

*strDest='\0';

return strDest;

}

char* tmp=strDest;

do

{

*tmp++=*strSrc;

} while (*strSrc++);

return strDest;

}

int main()

{

char str1[20],str2[20];

scanf("%s",str2);

printf("%s\n",StrCpy(str1,str2));//这一行就说明了返回char*的作用

return 0;

}

c语言ctype.h函数用法

#includestdio.h

#includestring.h

#includectype.h

int main()

{

int i;

char a[100]={0};

gets(a);

a[0]=toupper(a[0]);

for(i=1;istrlen(a);i++)

{

if(a[i-1]==' ')

{

a[i]=toupper(a[i]);

}

else ;

}

printf("%s\n",a);

}

我加了个等于应该就行了!

当前文章:h函数c语言 c语言之函数
文章路径:https://www.cdcxhl.com/article26/ddspejg.html

成都网站建设公司_创新互联,为您提供网站设计公司电子商务网页设计公司软件开发企业建站品牌网站制作

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都做网站