最近学STM32项目遇到问题。我在a.h定义了结构体 typedef struct{}A 并extern A my_a,在a.c初始化了my_a={参数值}。在c.c中我定义了一个函数 A exp(A _data),c.h中include"a.h",然后声明函数 A exp(A _data)(需要在main()中调用的),这时c.c单独编译通过,但是整体编译生成hex时候就会报APP/c.h(9): error: #20: identifier A" is undefined A A exp(A _data)
真的想不明白 求大佬救助
main.c
#include "a.h"
int main()
{
A Adata;
Adata=fun2(my_a);
}
a.c
#include "a.h"
A my_a={.a=1};
a.h文件
#ifndef _a_H
#define _a_H
#include "c.h"
typedef struct{
int a;
}A;
extern A my_a;
#endif
c.c文件
#include "c.h"
A fun2(A _data)
{
return _data;
}
c.h文件
#ifndef _c_H
#define _c_H
#include "a.h"
A fun2(A _data);
#endif
错误 .\app\c.h(4): error: #20: identifier "A" is undefined
A fun2(A _data);
需要修改两点:
1、删除a.h中对c.h的包含,因为a.h包含c.h,c.h又包含a.h,造成循环包含。
2、在main.c中包含c.h。
修改之前main.c展开如下,部分代码将不参与编译
#ifndef _a_H
#define _a_H
#ifndef _c_H
#define _c_H
#ifndef _a_H
#define _a_H
//以下代码不编译
#include "c.h"
typedef struct{
int a;
}A;
extern A my_a;
//以上代码不编译
#endif
A fun2(A _data);
#endif
typedef struct{
int a;
}A;
extern A my_a;
#endif
int main()
{
A Adata;
Adata=fun2(my_a);
}
前段时间我也过相同问题,这个主要是包含问题,结构体是a.h文件声明的,所以a.h应该放在最上面,编译器在c文件编译原理是将.h文件复制到c文件里,
只需要将a.h文件的#include"c.h" 删了即可;
另外我们用keill编译一般采用C/C++编译混合写,这样使用指针,共同体,结构体这些,不会出现不兼容问题