51单片机C语言学习笔记7:关于.c文件和.h文件
2009-09-15 09:55:43| 分类:| 标签: |举报 |字号大中小 订阅
1)h文件作用
1 方便开发:包含一些文件需要的共同的常量,结构,类型定义,函数,变量申明;
2 提供接口:对一个软件包来说可以提供一个给外界的接口(例如: stdio.h)。
2)h文件里应该有什么
常量,结构,类型定义,函数,变量申明。
3)h文件不应该有什么
变量定义, 函数定义。
4)extern问题
对于变量需要extern;
对于函数不需要因为函数的缺省状态是extern的.如果一个函数要改变为只在文件内可见,加static。
5)include包含问题
虽然申明和类型定义可以重复,不过推荐使用条件编译。
#ifndef _FILENAME_H,
#define _FILENAME_H
……
#endif
6)应该在那儿包含h文件
在需要的地方.比如某个提供接口的h文件仅仅被1.c文件需要,那么就在1.c文件里包含。编写的程序一般会有.H文件和相对应的.C文件,.H文件是声明所用,.C文件是其函数实现部分。在调用时只要包含.H文件即可,我们没有听说过#include \"delay.c\"这类的程序,同时也不提倡使用这个形
式。
在delay.h文件中: //对调用的函数声明
#ifndef __DELAY_H__
#define __DELAY_H__
extern void Delayms(unsigned int n);
#endif
在delay.c文件中: //函数实现部分
#include
//for crystal 11.0592M
void Delayms(unsigned int n)
{
unsigned int i,j;
for(j=n;j>0;j--)
for(i=112;i>0;i--);
}
在主程序main.c中
#include //在主程序包含.h文件,不能包含.c文件
……
上述方法仍然要求每建立一个工程就需要把对应的头文件复制到工程的文件夹里,这样看来仍然是比较麻烦的,这时还有另外一中方法就是将做好的头文件放在一个文件夹中,然后将这个文件夹整体拷贝到..KEIL\\C51\\INC\\下面,以后若需要使用某个头文件,就如使用KEIL自带的头文件一样方便了,在主函
数mani()之前有一句#include 就可以在main()中使用其中的函数了。
参考资料:
1)h文件里变量(函数)申明用不用extern
2).c文件和.h文件的概念与联系
3)过马路,左右看
4).c 和 .h文件的不同
5)C51包含头文件方法
防止头文件重复包含的方法
第一条预处理命令是说,如果MAXMIN_H不为真,说明此文件没被包含过,此命令后面的源代码有效(相当于:‘如果大门没关,请您进来’);
第二条预处理命令把MAXMIN_H置为真(相当于请您把门锁插上,不让第二个人进来)。 最后一条预处理命令是为了标出接受上述处理的源程序的范围(相当于您已经走到了后门)。 假定有以下几个头文件及其包含关系为:
File1.h,file2.h,file3.h,file4.h,file5.h,main.cpp
那么:file3.h包含file1.h,file2.h,file4.h包含file1.h,file2.h,file5.h包含file3.h,file4.h。就会导致在file5中对file1和file2的反复包含,编译时就会报错。
解决方法1:
1:应用#ifndef
#define
#endif
即每个文件在定义时都写成以下情势(以file1.h为例):
#ifndef H_FILE1
#define H_FILE1
#include
#include
…..
#endif
File3.h:
#ifndef H_FILE3
#define H_FILE3
#include
#include
#inlcude”file1.h”#include”file2.h”…..
#endif
方法二:在每个文件的头部定义:#pragmaonce(用于解释本文件中的内容只应用一次)例:fiel1.h:
#pragmaonce#include#include…..
File3.h:
#pragmaonce#include#include#include”file1.h”…..