【IAR】定义结构体出现的错误Error[e27]: redefined in module

liangchaoxi 2012-02-22 10:04:37
想定义两个结构体,在WARN.h 文件中定义结构体,然后再WARN.c文件中使用:

ER_WARN.Span=0x0000;ER_WARN.Span=0x0000;等,

结构编译器报错:Error[e27]: Entry "ER_WARN" in module AD ( C:…… ) redefined in module FINGERPRINT (…… )


我就纳闷了,在WARN.h中定义,在WARN.c中使用怎么会报这个错误呢。(声明一下,结构贴的成员仅在WARN.c文件中调用,其他文件没有)。

然后我又试着,将以下的定义放到:CONFIG.h 总的头文件中去,结果还是出现这个问题。百思不得其解。


然后,把整个结构体定义放到WARN.c文件中,编译通过。我就想是不是struct WARNING ER_WARN;、struct WARNING WARN;这两个语句的问题,然后我单独把这个两个语句放到WARN.c文件中,红色部分依然留在WARN.h 中,编译也通过了……

很是纳闷,这是为什么?



struct WARNING //报警
{
unsigned char Weight; //吊重
unsigned char Moment; //力矩
unsigned char Span; //限幅
unsigned char Lifting; //起升
unsigned char Rotary; //回转
unsigned char Wind; //风速
unsigned char DipAngle; //倾角
unsigned char Hight; //高度

};

struct EARLY_WARNING //预警
{
unsigned char Weight; //吊重
unsigned char Moment; //力矩
unsigned char Span; //限幅
unsigned char Lifting; //起升
unsigned char Rotary; //回转
unsigned char Wind; //风速
unsigned char DipAngle; //倾角
unsigned char Hight; //高度
};

struct WARNING ER_WARN;
struct WARNING WARN
;
...全文
6315 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
sandmanemperor 2013-09-23
  • 打赏
  • 举报
回复
那些全局变量放在.h文件中不是更好
skevil 2013-08-26
  • 打赏
  • 举报
回复
引用 10 楼 liangchaoxi 的回复:
[Quote=引用 9 楼 ilovedrv 的回复:] 即使可以通过#ifdef的方式解决问题,这也不是好的方法,对于变量的定义,应放在实现文件里面,然后通过extern的方式来引用 [/Quote] 我的问题解决了,声明放在头文件里面,定义变量还是要放到.C里面呀~~
求救啊楼主,我也是同个问题,怎么弄啊???
xhf468091479 2013-08-22
  • 打赏
  • 举报
回复
Error[e46]: Undefined external "main" referred in ?cstart ( E:\ruanjiankaifa\MSP430IAR\430\LIB\DLIB\dl430fn.r43 )
我的是出现了这个问题。不知道怎么解决啊、
aprogrammertoo 2012-02-26
  • 打赏
  • 举报
回复
切记切记,定义的变量要放在C文件里,声明才放在H文件,
ilovedrv 2012-02-24
  • 打赏
  • 举报
回复
即使可以通过#ifdef的方式解决问题,这也不是好的方法,对于变量的定义,应放在实现文件里面,然后通过extern的方式来引用
Barry-当下 2012-02-24
  • 打赏
  • 举报
回复
上面提到的方法也不通用,比如说有几个.c文件要包含同一个.h文件,而那个.h文件定义了变量或者结构编译还是会通不过,比较通用的方法是:专门用一个.c文件来定义变量或者结构,用对应的.h文件来声明。所有的.c文件都则都可以包含声明变量的.h文件。
dceacho 2012-02-24
  • 打赏
  • 举报
回复 3
在WARN.h 文件的最开始两行加上
#ifdef _WARN_H_
#define _WARN_H_


在该文件的最后一行加上

#endif
jobszheng5 2012-02-24
  • 打赏
  • 举报
回复
嘿嘿,学习一下吧。
回答已经晚了~~
Frog1228 2012-02-24
  • 打赏
  • 举报
回复
就是照楼上所说这样,很简单。就是开头有笔误,应该是 #ifndef 后面的符号自己随便定义。
liangchaoxi 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 mjjackey 的回复:]
标准的做法还是在.h文件中声明变量,在一个.c文件中定义变量,其它.c文件要用到变量只要包含.h头文件,相当于变量声明,就可以引用其它.c文件中定义的变量了。
[/Quote]
嗯,对。感谢大家的热情回答,真的很积极呀,气氛很好~~~谢谢大家
Frog1228 2012-02-24
  • 打赏
  • 举报
回复
标准的做法还是在.h文件中声明变量,在一个.c文件中定义变量,其它.c文件要用到变量只要包含.h头文件,相当于变量声明,就可以引用其它.c文件中定义的变量了。
liangchaoxi 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ilovedrv 的回复:]
即使可以通过#ifdef的方式解决问题,这也不是好的方法,对于变量的定义,应放在实现文件里面,然后通过extern的方式来引用
[/Quote]
我的问题解决了,声明放在头文件里面,定义变量还是要放到.C里面呀~~
liangchaoxi 2012-02-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mjjackey 的回复:]
引用 2 楼 lbing7 的回复:
你的头文件没有用LS那个所说的条件编译指令

当你在多个地方包含这个头文件的时候,就会在两个地方产生定义

因为,其实包含也是比较单纯的文本复制,相当于一个头文件被分别复制到两个地方,这个编译的时候当然就冲突了

+1,头文件重复包含,造成变量重复定义。用#ifndef.... #define ... #endif条件编译
[/Quote]

结构体怎么用 #ifndef.... #define ... #endif 预编译?? 举个例子吧
Frog1228 2012-02-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lbing7 的回复:]
你的头文件没有用LS那个所说的条件编译指令

当你在多个地方包含这个头文件的时候,就会在两个地方产生定义

因为,其实包含也是比较单纯的文本复制,相当于一个头文件被分别复制到两个地方,这个编译的时候当然就冲突了
[/Quote]
+1,头文件重复包含,造成变量重复定义。用#ifndef.... #define ... #endif条件编译
liangchaoxi 2012-02-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lbing7 的回复:]
你的头文件没有用LS那个所说的条件编译指令

当你在多个地方包含这个头文件的时候,就会在两个地方产生定义

因为,其实包含也是比较单纯的文本复制,相当于一个头文件被分别复制到两个地方,这个编译的时候当然就冲突了
[/Quote]

我的文件的结构是这样的:
就是各个文件有自己的头文件:
如:WARN.c的头文件是WARN.h

然后有一个头文件config.h包含所有的头文件,然后每个.c文件包含这个config.h头文件,这样的话就会出现上面的问题。


config.h 包含如下文件:

#include "msp430F5438A.h"
#include "math.h"
#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "main.h"

#include "WARN.h"
#include "HZK(SmallFonts).h"
#include "KDOA.h"
#include "LCD(SmallFonts).h"
#include "UART0.h"
#include "UART1.h"
#include "UART2.h"
#include "UART3.h"
#include "GPRS.h"
#include "AD.h"
#include "READIMEI.h"
#include "RTU-RTU.h"
#include "RTU-CENTER.h"
#include "ZIGBEE.h"
#include "SPIFRAM.h"
#include "VOICE.h"
#include "FINGERPRINT.h"
#include "RTOS.h"

但是,换另一种结构,那就是没有.c文件的结构,全部是.h文件,函数和变量的定义,执行代码,全部在.h中搞定,定义的函数、变量没有交叉包含,所以
在main.c中 我安排好这些.h的顺序:

#include "Global.h"
#include "HZK.h"
#include "PIC.h"
#include "LCD.h"
#include "AD.h"
#include "UART0.h"
#include "UART1.h"
#include "UART2.h"
#include "UART3.h"
#include "GSM.h"
#include "GPS.h"

然后在Global.h内 定义结构体,声明和定义变量在一起,可以通过没有报错这是为什么?

Global.h :

#define Edition_Len 13
#define TNumber_Len 15
#define State_Len 3

char Edition[Edition_Len] = "MSP430_V1.0"; //终端版本号
char TerminalNumber[TNumber_Len] = "";//"QJ_SB2010_MSP430"; //终端ID号
struct GPSGPRMC //0183协议数据
{
char GPS1_Head[6]; //GPS协议头 "$HZQJ"
char GPS2_Command[7]; //GPS命令字,固定值为"$GPRMC"
char GPS3_Time[GPS_TD]; //GPS时间
char GPS4_A[GPS_ANE]; //GPS有效位
char GPS5_weidu[GPS_wjfLen]; //GPS纬度
char GPS6_NS[GPS_ANE]; //GPS南北半球
char GPS7_jingdu[GPS_wjfLen]; //GPS经度
char GPS8_EW[GPS_ANE]; //GPS东西半球
char GPS9_Velocity[GPS_wjfLen]; //GPS速率
char GPS10_FWJ[GPS_wjfLen]; //GPS方位角
char GPS11_Date[GPS_TD]; //GPS日期
char GPS12_wuxiao1[GPS_ANE]; //无效
char GPS13_wuxiao2[GPS_ANE]; //无效
char GPS14_V[Edition_Len]; //GPS程序版本
char GPS15_ID[TNumber_Len]; //GPS终端ID
char GPS16_State[State_Len]; //GPS状态
char GPS17_Return[2]; //GPS返回值

};

struct GPSGPGGA //0183协议数据
{
char GPS1_Head[6]; //GPS协议头 "$HZQJ"
char GPS2_Command[7]; //GPS命令字,固定值为"$GPRGGA"
char GPS3_Time[GPS_TD]; //GPS时间
char GPS4_weidu[GPS_wjfLen]; //GPS纬度
char GPS5_NS[GPS_ANE]; //GPS南北半球
char GPS6_jingdu[GPS_wjfLen]; //GPS经度
char GPS7_EW[GPS_ANE]; //GPS东西半球
char GPS8_State[GPS_ANE]; //GPS状态,0=未定位,1=非差分定位,2=差分定位,3=无效PPS,6=正在估算
char GPS9_Satellite[GPS_SAT]; //正在使用的卫星数量00-12/////////
char GPS10_Hdop[GPS_HD]; //水平精度因子(0.5 - 99.9) ////////
char GPS11_Altitude[GPS_ALT]; //海拔高度(-9999.9 - 99999.9) ///////
char GPS12_AlUnit[GPS_ANE];// M 指单位米
char GPS13_Relative[GPS_REL];//天线离海平面的高度,-9999.9到9999.9米 M 指单位米
char GPS14_RelUnit[GPS_ANE];// M 指单位米
char GPS15_Fd[GPS_TD]; //差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空)
char GPS16_ID[GPS_ID]; //差分站ID号0000 - 1023(前导位数不足则补0,如果不是差分定位将为空)
char GPS17_Return[2]; //GPS返回值


};

struct GPSGPRMC GPS_GPRMC; //GPS数据结构体
struct GPSGPGGA GPS_GPGGA; //GPS数据结构体


lbing7 2012-02-23
  • 打赏
  • 举报
回复
你的头文件没有用LS那个所说的条件编译指令

当你在多个地方包含这个头文件的时候,就会在两个地方产生定义

因为,其实包含也是比较单纯的文本复制,相当于一个头文件被分别复制到两个地方,这个编译的时候当然就冲突了
AnYidan 2012-02-22
  • 打赏
  • 举报
回复
一般只在头文件中声明变量,在原文件中定义变量,

即使你在头文件中使用了预编译指令 #ifndef.... #define ... #endif,也不能在头文件中定义变量

27,377

社区成员

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

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