我正在使用Keil MDK ARM开发一个项目。但是,当我尝试构建代码时,该软件工具会引发错误:L6218E:未定义的符号位(从main.o引用)。 其中Bit是我用来存储布尔值的结构。例如:
在variable.h文件中
struct
{
unsigned bPowerONStatus : 1;
unsigned bTimerONStatus : 1;
} extern Bit;
在main.c文件中:
#include variable.h
int main()
{
while(1)
{
ReadTimerStatus();
if(Bit.bPowerONStatus)
{
// System is ON
}
else
{
// System if OFF
}
}
}
在PowerChecker.c文件中
#include variable.h
void ReadTimerStatus(void)
{
if(Bit.bTimerONStatus)
{
Bit.bPowerONStatus = 1;
}
else
{
Bit.bPowerONStatus = 0;
}
}
我在这里做错了什么?可以在多个源文件中使用的定义结构的正确方法是什么?
答案 0 :(得分:1)
在文件范围内使用关键字extern
声明变量,但没有初始化程序,则声明该变量具有外部链接,但不定义。在程序的其他地方需要定义变量。
对于您的Bit
变量,已使用没有类型别名的匿名struct
类型进行了声明,因此在定义变量时无法使用相同的类型。为了解决此问题,您需要使用标签定义struct
类型,或者在struct
声明中定义typedef
类型,或者您可以执行两者。
在声明的前面放置存储类说明符(例如extern
)是更常规的做法。
在variable.h中:
struct StatusBits
{
unsigned bPowerONStatus : 1;
unsigned bTimerONStatus : 1;
};
extern struct StatusBits Bits;
仅在一个C文件中,例如main.c或variable.c:
#include "variable.h"
struct StatusBits Bits;
请注意,上面的struct StatusBits Bits;
具有外部链接并且没有初始化程序,但是尚未声明为extern
,因此它是{{1}的临时定义。 }变量。除非被初始化程序定义相同的变量所覆盖,否则它将表现为已用Bits
进行了初始化。