打印

单片机C语言include的问题,相当混乱...

[复制链接]
2305|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zq1987731|  楼主 | 2008-11-18 22:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    最近用RealView MDK 3.24写ARM7的程序,话说...RealView+ULINK1的配合又经济又方便...相当得爽~~意外得我发现个困扰好久的问题:

    我的程序中有I2C,SPI,FRAM,ADC,DAC,PWM,TIMER等等的模块,为了看起来清楚些,我就每个模块都写个.c(放功能函数的)和.h(用来声明对应.c文件中的所有函数),.h里面用了条件编译防止重复包含命令,然后做了个includes.h文件把所有的.h文件都包含了,每个.c分别再包含自己的.h文件以及什么都包含的includes(比如I2C.c里就包含了includes.h和I2C.h)...再然后写个主函数所在的文件main.c,包含了那个includes.h文件。
    接着就有些迷惑了,功能实现是没什么问题,但是既然在includes.h中已经包含了,同时又在相关的.c中又包含了,下面先举例3个文件:
/************************includes.h文件************************/
#include "PWM.h"
#include "DIO.h"
#include "ADC.h"
#include "DAC.h"
#include "I2C.h"
/**************************************************************/



/*************************I2C.h文件****************************/
#ifndef _I2C_H_
#define _I2C_H_

extern void I2C_Write(uint8 Addr_Device, uint8 Addr_Byte, uint8 Byte);
extern uint8 I2C_Read(uint8 Addr_Device, uint8 Addr_Byte);

#endif
/**************************************************************/



/*************************I2C.c文件****************************/
#include "includes.h"
#include "I2C.h"

extern void I2C_Write(uint8 Addr_Device, uint8 Addr_Byte, uint8 Byte)
{
    XXXXXXXXXX
}

extern uint8 I2C_Read(uint8 Addr_Device, uint8 Addr_Byte)
{
    XXXXXXXXXX
}
/**************************************************************/


那么上面的3个文件是什么样的关系呢?
我个人的理解是这样的,不知道对不对:
/**************************************************************/
//#include "includes.h"
//下面5行是上面包含命令的展开
#include "PWM.h"
#include "DIO.h"
#include "ADC.h"
#include "DAC.h"
#include "I2C.h"

//#include "I2C.h"
//因为includes.h中已经包含有I2C.h,所以上面的包含命令被条件编译命令阻止重复编译,即这条命令被省略

extern void I2C_Write(uint8 Addr_Device, uint8 Addr_Byte, uint8 Byte)
{
    XXXXXXXXXX
}

extern uint8 I2C_Read(uint8 Addr_Device, uint8 Addr_Byte)
{
    XXXXXXXXXX
}
/**************************************************************/
    另外这样的话我所有的XXX.c文件的第二行即#include "XXX.h"都可以去掉呢?
    然后既然是不同.c的引用(比如FRAM.c里有函数引用了I2C.c文件中的函数)那么是否所有被引用的函数都要声明为extern函数?但是实际上我去掉所有的extern后仍然可以互相引用(文件包含关系就是上面我所说到的),难道这个extern是默认属性?还是那个诡异的includes.h起了作用呢?(相当于所有函数的声明)

相关帖子

沙发
一级菜鸟| | 2008-11-18 22:13 | 只看该作者

不通的编译器对extern要求不一

某些编译器只需要声明,不带extern都可以。

另外,你的函数体前,不需要加extern,声明就行

使用特权

评论回复
板凳
zq1987731|  楼主 | 2008-11-18 22:19 | 只看该作者

怪不得...

我的函数现在搞得不是extern就是static的,真是乌烟瘴气...原来只要声明的时候加啊...受教了,谢谢

使用特权

评论回复
地板
呆板书生| | 2008-11-19 08:33 | 只看该作者

显然楼主对C语言的多个文件链接未入门

extern 是指外部定义的函数,有了extern,虽然这个C文件中没有这个函数,但这个函数的入口参数如何已经有了,

比如,虽然没有add函数,但有了ADD函数的说明,编译器就知道add(2,3)如何编译

static 是指静态函数,这个函数将来不给别的文件所使用,以免冲突,就要用static

比如我有一个sub的函数,但由于参数是char类型的,可能有别的文件有同名的函数,但参数类型是int型,所以需要用static,

至于.c 和.h文件,其实对于编译器可能都一样,只是我们习惯用.c来定义自己的实现内容,而.h是通知外部文件我已经定义了某些东西,你们可以当成库来调用就OK,

我一向不喜欢把所有的.h打包,我可能这样写:

把8563当成一个模块,因为8563.c要使用i2c,所以,在函数的开始地方,要include “i2c.h”

而main主文件中,因为使用了 8563 和 24C02,所以分别include “8563.h”和“24C02.h”,从程序结构上看,各个模块之间的关系就一目了然

使用特权

评论回复
5
yewuyi| | 2008-11-19 09:04 | 只看该作者

确实相当的乱。。。

使用特权

评论回复
6
mymystery| | 2008-11-19 09:11 | 只看该作者

NND 我也混乱了一阵时间

现在直接都写在一个main.c里面包含一个main.h就行了 哈哈

使用特权

评论回复
7
aceice| | 2008-11-19 09:35 | 只看该作者

各模块就没有必要再写一次包含自身的.h吧~

直接一个main.h包含所有的
------------------
I2C模块
#include "main.h"
.
.
.
------------------
main.h
#include "i2c.h"
#include <reg52.h>
.
.
.
------------------

使用特权

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

本版积分规则

95

主题

759

帖子

3

粉丝