打印

单片机 C51 两种编写头文件方法 哪个比较好

[复制链接]
15082|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
349264710|  楼主 | 2010-9-29 17:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在学模块化编程。要自己写头文件。看了一下别人的头文件,无非就两种。
一种是只有一个.h文件,把函数的定义及函数的具体实现都放在一个.h文件中。
另外一种是一个.c文件,一个.h文件。.c是函数的具体实现,而.h只是定义函数。
这两种谁优谁劣?

相关帖子

沙发
yewuyi| | 2010-9-29 17:47 | 只看该作者
第二个比第一个稍微好点。

第二个的修改:C文件中定义函数和变量及函数的具体代码,在H文件做变量和函数的声明以及其他的宏定义,不应该涉及具体的代码实现和函数定义等。

使用特权

评论回复
板凳
349264710|  楼主 | 2010-9-29 18:03 | 只看该作者
那我的这句
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
应该放在.c文件中,还是.h文件中呢?还是两个都要放?应为我的.c文件中也要用到uint,uchar。

2# yewuyi

使用特权

评论回复
地板
孤傲雕| | 2010-9-29 21:53 | 只看该作者
我感觉应该放在.h中

使用特权

评论回复
5
McuPlayer| | 2010-9-29 22:08 | 只看该作者
首先C不是头文件,所谓头文件,英文中是header file,也就是.h文件

使用特权

评论回复
6
ayb_ice| | 2010-9-30 08:27 | 只看该作者
xx.c
xx.h

使用特权

评论回复
7
yewuyi| | 2010-9-30 08:38 | 只看该作者
那我的这句
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
应该放在.c文件中,还是.h文件中呢?还是两个都要放?应为我的.c文件中也要用到uint,uchar。

2# yewuyi  ...
349264710 发表于 2010-9-29 18:03



放在一个H文件中,被各个C文件调用

使用特权

评论回复
8
hqgboy| | 2010-9-30 09:09 | 只看该作者
搞一个公用的头文件,其他模块都是独立的XXOO.C 和XXOO.H...
每一个XXOO.H都包含公用的头文件。
每一个XXOO.C都包含自己的头文件。

使用特权

评论回复
9
andloani| | 2010-9-30 10:57 | 只看该作者
路过的大侠请帮我看一下我的理解对不:
hqgboy说:“
搞一个公用的头文件,其他模块都是独立的XXOO.C 和XXOO.H...
每一个XXOO.H都包含公用的头文件。
每一个XXOO.C都包含自己的头文件。
"
我的理解就是:

#define unsigned int uint
#define unsigned char uchar
这类所有c文件都要用到的放在一个公共的.h文件,比如叫public.h
然后后面就是
display.h(这里面要#inculde"public.h")
display.c(这里面要#include"display.h")
keyscan.h
keyscan.c
然后写一个main.c里面先包含public.h,display.h和keyscan.h然后就可以调用display和keyscan里面的函数了是吧?
我的理解对吗?

使用特权

评论回复
10
HWM| | 2010-9-30 11:19 | 只看该作者
关于C中的“头文件”:

C(或C++)中的所谓头文件其实就是编译中第一次扫描是所做的“文本嵌入”。有点类似于宏替代,只不过其被放置在一个独立的文件中而已。

由于头文件可以被多模快引用,因此通常不能将具体变量或函数的实体放入到头文件中定义。否则,若被多模块引用后,便会出现重复定义的问题。另外,由于语法上不限制在同一模块中多处引用同一头文件,因此必须在头文件中加入相关条件编译来防止重复引用。

一般而言,头文件中通常放置的是各种变量类型或函数原型的定义。由于相关定义可以是全局的或局部于某一模块的,因此一般采用树状结构组织相关的头文件。全局头文件处在树根处,然后按模块关系逐级构建相关自树,最终“树叶”作为具体相关模块的头文件。树的母子关系体现在头文件间的嵌入引用关系(母嵌入在子中)。

使用特权

评论回复
11
linqing171| | 2010-9-30 12:44 | 只看该作者
9楼的是对的。

使用特权

评论回复
12
hqgboy| | 2010-9-30 12:52 | 只看该作者
公用的#include  "config.h"
#include    <stdio.h>
#include    <string.h>
#include    <ctype.h>
#include    <stdlib.h>
#include    <setjmp.h>
#include    <rt_misc.h>
#include    "target.h"                               //This line may not be deleted 这一句不能删除


#include        "I2CINT.H"
#include        "HQGARM.H"
#include        "TFTLCD.H"
#include        "ZLG7289.H"
//#include        "UART0.H"
#include        "UART1.H"

使用特权

评论回复
13
hqgboy| | 2010-9-30 12:53 | 只看该作者
display.c

keyscan.c
都包含#include  "config.h"

使用特权

评论回复
14
seabada| | 2010-9-30 13:17 | 只看该作者
学习

使用特权

评论回复
15
apefrank| | 2010-9-30 14:07 | 只看该作者
第二种
全局变量、模块接口都在h文件里声明
模块的私有变量和函数的声明和定义都放在c文件里
总之就是OOP的思想

使用特权

评论回复
16
hxcic| | 2010-9-30 14:13 | 只看该作者
第二个好点。

使用特权

评论回复
17
kalay| | 2010-9-30 16:17 | 只看该作者
第二种好

使用特权

评论回复
18
fushaobing| | 2010-9-30 16:37 | 只看该作者
同意12、13楼。
1. 建立一个“总的头文件”,它包含所有的头文件。
2. 在每一个.c文件中包含该“总的头文件”。
很省事。
uCOS/II就是这样做的。

使用特权

评论回复
19
john_light| | 2010-9-30 16:50 | 只看该作者
18楼的“总头文件”的做法往往是为了简化C文件和相关头文件的包含关系,不过我觉得有两个副作用:
1、模块间的层次没能在源文件中清晰体现;
2、只要你改动其中任一个头文件,编译器会重新编译所有源文件。

使用特权

评论回复
20
jianghehupo| | 2010-9-30 21:46 | 只看该作者
同意楼上,“总头文件”虽然简化了书写,但是却导致编译效率的降低,另外不利于程序的阅读。
uCOS/II这样做的好处是你可以把uCOS/II当成一个黑盒子(这里只是理解上这么做,跟开源没关系),你的程序在需要调用系统服务的时候包含“总头文件”就OK了。
但是一个工程中,除了uCOS/II本身的文件,我们自己编写的应用模块可能还有好多个,它也不是简单的像:
aa.h   aa.c
bb.h   bb.c
...
然后在main.c中包含aa.h,  bb.h  等头文件一样,在aa.c中你肯俄国调用了bb.c中的内容。

因此感觉10楼所说的头文件树是比较合适的,希望HWM能给出一个例子来讨论讨论。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

77

帖子

3

粉丝