keil4编译多头文件程序时重复定义怎么办?

wiseo 2016-12-21 09:15:46
初学51单片机,
以前一直把所有程序和声明写在同一个c文件里,
后来被指导,不同模块可以分开编写,方便区分和再利用,
每个模块(如按键,AD,液晶)包括一个c文件和一个h文件,
但是编写过程中发现,不同c文件会共用同一个函数或变量,
这时,如果分别声明、定义,会警告重复定义,
如果只定义一遍,因为多处调用,又会警告函数或变量未定义,
所以不知道到底该怎样编写才能避免这个问题?
今天偶然发现本论坛,觉得很厉害,有很多不懂,求大神解答
...全文
1813 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wiseo 2016-12-22
  • 打赏
  • 举报
回复
刚才多试了几次知道,像那种同时调用多个函数的函数,写到主函数中就可以避免重复定义的问题。变量也是,定义到主函数中。 原来我的程序主函数很空,只有一个初始化lcd的函数,这样就相当于把lcd的初始化函数当作主函数使用了,正确做法应该把lcd初始化函数中与lcd无关的东西写到主函数中,这样分模块会更加清楚,也不会警告了。
wiseo 2016-12-22
  • 打赏
  • 举报
回复
引用 1 楼 C_Rabbit 的回复:
善用宏定义
#ifndef __GPS_SR87_H 
#define __GPS_SR87_H

//--------------------------------
// Includes
//--------------------------------
#include "Stm32_Init.h"

//--------------------------------
// Private typedef
//--------------------------------

//--------------------------------
// Private define
//--------------------------------
#define GPS_RECV_DATA(addr)       USART1_RecvData(addr)

#define GPS_SEND_DATA(data,len)   USART3_SendData(data, len)

//--------------------------------
// Private macro
//--------------------------------

//--------------------------------
// Private variables
//--------------------------------

//--------------------------------
// Private function prototypes
//--------------------------------
void ChkGpsData(void);
void SendGpsData(void);

#endif // __GPS_SR87_H
感谢回复,但是我想问的是,在有多个头文件的时候,假设每个头文件对应的c文件都要使用同一个函数,在每个头文件声明这个函数的时候会警告重复定义。定义变量的时候也是会警告这个问题。不知道怎么解决
C_Rabbit 2016-12-22
  • 打赏
  • 举报
回复
善用宏定义
#ifndef __GPS_SR87_H 
#define __GPS_SR87_H

//--------------------------------
// Includes
//--------------------------------
#include "Stm32_Init.h"

//--------------------------------
// Private typedef
//--------------------------------

//--------------------------------
// Private define
//--------------------------------
#define GPS_RECV_DATA(addr)       USART1_RecvData(addr)

#define GPS_SEND_DATA(data,len)   USART3_SendData(data, len)

//--------------------------------
// Private macro
//--------------------------------

//--------------------------------
// Private variables
//--------------------------------

//--------------------------------
// Private function prototypes
//--------------------------------
void ChkGpsData(void);
void SendGpsData(void);

#endif // __GPS_SR87_H
C_Rabbit 2016-12-22
  • 打赏
  • 举报
回复
引用 3 楼 wiseo 的回复:
刚才多试了几次知道,像那种同时调用多个函数的函数,写到主函数中就可以避免重复定义的问题。变量也是,定义到主函数中。 原来我的程序主函数很空,只有一个初始化lcd的函数,这样就相当于把lcd的初始化函数当作主函数使用了,正确做法应该把lcd初始化函数中与lcd无关的东西写到主函数中,这样分模块会更加清楚,也不会警告了。
其实,是应该分清楚子函数实体应该放在什么位置的概念 而实际上LCD驱动程序这样的子函数集合体,里面经常用到delay()这样的延时函数,这个时候一般的做法是,delay()的实体放到主函数里,然后在LCD驱动程序所在的文件里,使用宏定义的方式来指向delay()。这样就不会有重复定义的问题了,也方便驱动移植。
lr2131 2016-12-22
  • 打赏
  • 举报
回复
写代码没有好的风格,就会出现这样低级的问题。 在.c文件中定义,在同名的.h文件中声明。 h文件,中要用到条件编译,就不会出现多文件包含定义等什么奇葩问题。

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧