欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

keil报错:Symbol set_value multiply define和 incomplete type is not allowed和error:  #65: expected a “;“

程序员文章站 2024-01-31 09:04:46
...

一个是重复定义,一个是不完整类型,一个是缺一个;

第一个:重复定义,一般最多的就是两个文件中的变量定义重复而报错,一般这种改一下名就差不多了,而另一种就比较难看出来了。比如:定义一个结构体在sys.h的文件中,并在文件中进行了定义和初始化,然后在sys.c文件中调用了定义的结构体,同时因为在.h的文件中,所以在main.c中也可以调用定义的结构体,最后编译报错。因为在.h文件中进行了定义,当被两个.c文件调用后就被重复定义了。

例:
sys.h:
struct xxx
{
 int data;
};

struct xxx xx;

#include"sys.h"
sys.c:

void max(void)
{
    xx.data = 100;
}

#include"sys.h"
main.c:
void min(void)
{
    xx.data = 100;
}
编译会报错,正确的应该把struct xxx xx拿到sys.c的文件中,要在其他位置用的时候extern一下。

第二个问题不完整类型

还是上面的例子:

例:
sys.h:


#include"sys.h"
sys.c:

struct xxx
{
 int data;
};

struct xxx xx;

void max(void)
{
    xx.data = 100;
}

#include"sys.h"
main.c:
void min(void)
{
    xx.data = 100;
}
编译会报错,正确的应该把
struct xxx
{
 int data;
};
拿到sys.h的文件中,要在其他位置用的时候extern一下。

还有一个:error:  #65: expected a ";"

一般就是缺了个;,一般加一个就可以了。

还有一种,在某个.h文件中的最后一句缺了一个分号;。结果这个.h文件被几十个文件调用,就会突然出现几十条问题出来。

相关标签: stm32 keil mdk