你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

工程链接时 出现重复定义问题!!!!

[复制链接]
su-409464 提问时间:2015-10-16 14:20 /
请问一个头文件 定义报错问题

我自己定义了一个 wifi_uart.h 的文件, 文件中很多unsigned char  和布尔  变量要定义。

我调用了  uin8_t  和bool  来定义, 如下:

  • #ifndef _wifi_uart_H
  • #define _wifi_uart_H
  • #include "stm8s.h"
  • /*************    本地变量声明    **************/
  • uint8_t    RX1_Buffer[RX1_Lenth];    //接收缓冲 idata
  • uint8_t    TX1_Cnt;    //发送计数
  • uint8_t    RX1_Cnt;    //接收计数
  • bool    B_TX1_Busy;    //发送忙标志
  • #endif

复制代码

因为uint8_t 是 在stm8s.h 中 定义的。
  • /*!< Unsigned integer types  */
  • typedef unsigned char     uint8_t;
  • typedef unsigned short    uint16_t;
  • typedef unsigned long     uint32_t;
  • typedef enum {FALSE = 0, TRUE = !FALSE} bool;

复制代码

     所有我在 wifi_uart.h 中    添加了头文件  #include "stm8s.h"  

但是编译的的时候出现了 重复定义的错误:
   #error clnk Debug\smartsocket.lkf:58 Debug\wifi_uart.o: symbol _RX1_Buffer multiply defined (Debug\main.o)


     我把 wifi_uart.h 中    的 #include "stm8s.h"  注释掉:
   编译的时候 却 显示了 一大堆  缺少  ”;“  的 错误,  但实际是没有缺的

      #error cpstm8 inc\wifi_uart.h:20(0+7) missing ;


    我想 只把 下面句加到 wifi_uart.h 中
     编译的时候 也是报了 重复定义的错误!!!!
  • /*!< Unsigned integer types */
  • typedef unsigned char uint8_t;
  • typedef unsigned short uint16_t;
  • typedef unsigned long uint32_t;
  • typedef enum {FALSE = 0, TRUE = !FALSE} bool;

复制代码


        请问具体是该如何处理?


最后我向苍天保证  RX1_Buffer  只在 wifi_uart.h  中定义一次!!!!!! 苍天作证!!!!!

收藏 评论15 发布时间:2015-10-16 14:20

举报

15个回答
enjoyfreescal 回答时间:2015-10-16 16:41:58
su-409464 发表于 2015-10-16 16:04
我终于明白你的意思了!!!!

”数据定义应该在.c文件中定义,在.h文件中声明“

不需要,最简单的方法,如我之前说的,可以定义一个.c文件专门定义变量,同时定义相应.h文件声明相应变量,然后其他.c都包含该.h文件即可(如同你的stm8s.h文件一样,导出都需要)
dsjsjf 回答时间:2015-10-16 15:28:41
不要在头文件中定义变量
xuguomin 回答时间:2015-10-16 14:47:59
如果stm8s.h 是总头文件 应该在 "stm8s.h"包含wifi_uart.h
enjoyfreescal 回答时间:2015-10-16 14:30:04
上传工程看一下,还有就是数据定义应该在.c文件中定义,在.h文件中声明,否则多处调用.h会重复定义
enjoyfreescal 回答时间:2015-10-16 14:36:29
在.h文件加关键字extern:
extern uint8_t    RX1_Buffer[RX1_Lenth];
su-409464 回答时间:2015-10-16 14:36:31
enjoyfreescal 发表于 2015-10-16 14:30
上传工程看一下,还有就是数据定义应该在.c文件中定义,在.h文件中声明,否则多处调用.h会重复定义 ...

但是有些数据 不单单 这个 wifi_uart.c 要用到。


我的想法是  在wifi_uart.h 中 统一定义,   其他c 文件 要用到就调用一下 这个h 文件!!!


自己工程架构能力还是很差很不规范!!!

smartsocket_wifi.rar

下载

3.83 MB, 下载次数: 10, 下载积分: ST金币 -1

enjoyfreescal 回答时间:2015-10-16 14:38:08
su-409464 发表于 2015-10-16 14:36
但是有些数据 不单单 这个 wifi_uart.c 要用到。

那你可以建立一个.c专门负责数据的创建,和一个.h负责相应声明,其他.c文件调用即可。
xuguomin 回答时间:2015-10-16 14:44:55
不能包含 #include "stm8s.h"
enjoyfreescal 回答时间:2015-10-16 14:46:00
本帖最后由 enjoyfreescal 于 2015-10-16 14:49 编辑
su-409464 发表于 2015-10-16 14:36
但是有些数据 不单单 这个 wifi_uart.c 要用到。

E:\测试\smartsocket_wifi\inc\wifi_sys.h:14:uint8_t        RX1_Buffer[RX1_Lenth];        //接收缓冲 idata
E:\测试\smartsocket_wifi\inc\wifi_uart.h:18:uint8_t        RX1_Buffer[RX1_Lenth];        //接收缓冲 idata
你重复定义了!!还有你#include "wifi_uart.h"这个在main.c和wifi_uart.c都调用了,所以RX1_Buffer[RX1_Lenth];声明了两次
pwdzsj 回答时间:2015-10-16 15:10:23
有时候编译器版本不一样也会出现这种情况
12下一页

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版