C编程错误:结构的未定义符号(Keil错误L6218E)

时间:2019-12-09 08:45:26

标签: c arm keil

我正在使用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;
    }
}

我在这里做错了什么?可以在多个源文件中使用的定义结构的正确方法是什么?

1 个答案:

答案 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进行了初始化。