最近用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起了作用呢?(相当于所有函数的声明)
|