十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
额,书上都有吧。
成都创新互联是由多位在大型网络公司、广告设计公司的优秀设计人员和策划人员组成的一个具有丰富经验的团队,其中包括网站策划、网页美工、网站程序员、网页设计师、平面广告设计师、网络营销人员及形象策划。承接:成都网站建设、成都网站设计、网站改版、网页设计制作、网站建设与维护、网络推广、数据库开发,以高性价比制作企业网站、行业门户平台等全方位的服务。
一般来说,头文件(.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文件也应如此,这里就留给同学自己添加了。
参考网址:
一个.h文件要
对应有一个.c文件,这样写助于查看和修改程序。比如a.h
和
a.c;:
在.h文件中
#ifndef
__A_H_
#define
__A_H_
#include
void
trans2(double
B)
;
double
trans1()
;
#endif
在.c文件中
#include
"a.h"
把相应的函数定义写在.c文件中
再在main.c文件中
#include
"a.h"
#include
main()
{
double
trans1()
//由度分秒到弧度
{
double
B1,B11,B12,B13,B111;
scanf("%lf°%lf′%lf″",B11,B12,B13);
B111=fabs(B11);
//B11可能为负值
B1=B111+B12/60.0+B13/3600.0;
B1=B1*atan(1)/45.0;
if(B110)
B1=-B1;
return
B1;
}
void
trans2(double
B)
//由弧度到度分秒并输出角度值
{
int
a,b;
double
B0;
B0=fabs(B);
//B可能为负值
double
c;
B0=B0*45.0/atan(1);
a=int(B0);
b=int((B0-a)*60);
c=(B0-a)*3600-b*60;
if((int)(c)==60)
//为了避免出现59′60″这种情况,不过好像不起作用,不知道为什么,原来是int没有加括号
{
b=b+1;
c=0.0;
}
if(b==60)
{
b=0;
a=a+1;
}
if(B0)
a=-a;
printf("%d°%d′%.4f″\n",a,b,c);
}
}
就可以在main.c函数中调用a.c中的函数了
首先建头文件是为了声明c文件中的函数,以及包括宏定义。建立头文件要有对应的c文件。我简单地谢了一个c文件,里面有一个函数。
下面要写头文件首先要建一个.h文件
打开h文件,进行编辑。建立头文件是有一定步骤的。要用到#ifndef。。。#define。。。。#endif。这是为了避免重复定义
#ifndef后面要写的是头文件名称的大写。例如:test.h要写成__TEST_H__。前面与后面是两个下划线。字母用大写
然后在define与endif中间声明你的函数名,记得写冒号呦。
然后在main文件中写上include这个头文件,就可以调用了。
然后编译,运行,就OK了。祝大家学习愉快。