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

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

[复制链接]
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个回答
心中月古 回答时间:2015-10-16 16:41:58
su-409464 发表于 2015-10-16 16:04
我终于明白你的意思了!!!!

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

不需要,最简单的方法,如我之前说的,可以定义一个.c文件专门定义变量,同时定义相应.h文件声明相应变量,然后其他.c都包含该.h文件即可(如同你的stm8s.h文件一样,导出都需要)
埃斯提爱慕 回答时间:2015-10-16 15:28:41
提示: 作者被禁止或删除 内容自动屏蔽
xuguomin 回答时间:2015-10-16 14:47:59
如果stm8s.h 是总头文件 应该在 "stm8s.h"包含wifi_uart.h
心中月古 回答时间:2015-10-16 14:30:04
上传工程看一下,还有就是数据定义应该在.c文件中定义,在.h文件中声明,否则多处调用.h会重复定义
心中月古 回答时间: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

心中月古 回答时间: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"
心中月古 回答时间: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
有时候编译器版本不一样也会出现这种情况
su-409464 回答时间:2015-10-16 15:59:08
xuguomin 发表于 2015-10-16 14:44
不能包含 #include "stm8s.h"

不能包含 stm8.h   请问  uint8_t  和 bool  怎么办???

wifi_uart.h  中要用到这个两个 来定义变量怎么办????
su-409464 回答时间:2015-10-16 16:04:14
enjoyfreescal 发表于 2015-10-16 14:46
E:\测试\smartsocket_wifi\inc\wifi_sys.h:14:uint8_t        RX1_Buffer[RX1_Lenth];        //接收缓冲  ...

我终于明白你的意思了!!!!

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

这是最基本的要诀!!!都怪自己基础太差!!!!!

推荐大家看看  :”过马路 看左右“ 的博文!!!!!
https://wenku.baidu.com/link?url ... PvLnjRyoGCD7usf8d5m




但是我还是有个疑惑!!!!!如下:

如果 变量  被  其他很多  A.c   B.c  C,c  ...... 都用到
1.  那么 是不是 应该在main.c  中定义, 然后 A.h  B.h  .....文件中 extern 声明??????
2.  如果是这样, 那么变量多了呢???? 不会 都在main.C 中定义 ,然后其他c文件中extern吧?????

你好我好大家好! 回答时间:2015-10-16 16:16:23
帮顶                           
cxy 回答时间:2015-10-16 17:05:34
一些数据类型在库中本来就有
12下一页

所属标签

相似问题

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