C Programming Error: undefined symbol to a struct (Keil error L6218E)

C Programming Error: undefined symbol to a struct (Keil error L6218E)

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

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

使用关键字 extern 在文件范围内声明一个变量,但没有初始化器声明变量具有外部链接,但不会 定义 变量。需要在程序的其他地方定义变量。

对于您的 Bit 变量,它已使用没有类型别名的匿名 struct 类型声明,因此在定义变量时无法使用相同的类型.为了解决这个问题,您需要使用 标签 定义 struct 类型,或者在 typedef 声明中定义 struct 类型,或者你可以两者都做。

将存储class说明符如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,所以是暂定的定义Bits 变量。除非被具有初始值设定项的同一变量的定义覆盖,否则它将表现得好像已使用 {0}.

初始化一样