typedef定义一个结构体类型,多文件引用出错,求助!

2019-12-13 18:23发布

在一个“clink.h”的文件中定义一个链表结构体
  1. typedef struct Elink{

  2.          uint8_t *  head;/*数据写入缓冲区头部*/
  3.          uint8_t *  headbuf;/*缓冲区头部指针*/
  4.          uint8_t *  endLen;/*缓冲区尾结束指针*/
  5.          uint16_t  dataLen;/*缓冲区内数据长度*/
  6.         struct Elink *next;
  7. }ClinkType;
复制代码

再在一个缓冲文件“ringBuf.h”包含了“clink.h”
  1. #include "ringBuffer.h"
  2. #include "clink.h"
复制代码

在“ringBuf.h”中定义一个函数带ClinkType 类型的指针形参
  1. bool WriteDataToRingBuffer(ringBufType_t *pRingBuf,ClinkType *Phead,uint8_t *pBuf, uint16_t len);
复制代码

编译之后报错,说ClinkType未定义: error:  #20: identifier "ClinkType" is undefined;

请问各位大神,我是用错了嘛,还是那里不对了?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
37条回答
mii
1楼-- · 2019-12-18 13:06
zhugean 发表于 2019-2-25 10:19
是不是头文件交叉相互包含引起的?

我猜想也是,但为什么STM32库里文件很多这种写法,但人家就没有出现这种情况。我们平时在什么文件调用声明都可以
go2deathward
2楼-- · 2019-12-18 19:00
mii 发表于 2019-2-25 10:36
是如你所说,改变位置后是可以编译通过,就是看着难受。

在STM32的库文件中很多都是定义 在.H文件中, ...

大概官方的是没有交叉包含吧
xf331785508
3楼-- · 2019-12-19 00:13
mii 发表于 2019-2-25 10:11
感谢各位大神的意见,但还是再表达一次我现在的现象。主要增加一些图片来讨论会比较直观一点。

把clink.h中的第7行挪到第17行,包你编译通过。
xf331785508
4楼-- · 2019-12-19 02:45
 精彩回答 2  元偷偷看……
sbusr
5楼-- · 2019-12-19 07:04
本帖最后由 sbusr 于 2019-2-25 14:08 编辑
mii 发表于 2019-2-25 10:11
感谢各位大神的意见,但还是再表达一次我现在的现象。主要增加一些图片来讨论会比较直观一点。


看23楼最后一张图,Clink.c这一行,下面的未定义的提示。
是Clink.h包含了ringBuffer.h
应该是头文件互相包含引起的。Clink.h包含了ringBuffer.h,而ringBuffer.h又包含了clink.h
所以就呵呵了。
修改,是.h文件互相包含了。导致编译器在展开的时候,就没有链表的定义的。请阅读关于#ifdef在.h文件开头的使用。
zhikunWang
6楼-- · 2019-12-19 11:58
这个问题同样一直困扰我,我目前是所有的头文件包含在一个文件中,然后注意头文件的顺序。
但是如果有多个结构体在多个头文件中,然后还有一个函数形参包含多个结构体,这个时候编译
大多会编译不通过,这个时候不知如何解决声明在前,使用在后的问题?

一周热门 更多>