搜索
bottom↓
回复: 37

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

[复制链接]

出0入0汤圆

发表于 2019-2-21 18:30:44 | 显示全部楼层 |阅读模式
在一个“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;

请问各位大神,我是用错了嘛,还是那里不对了?

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

 楼主| 发表于 2019-2-21 19:29:58 | 显示全部楼层
没有大神解释一下嘛,在线等

出0入25汤圆

发表于 2019-2-21 19:33:35 来自手机 | 显示全部楼层
把结构体定义和例化分开。结构体定义放到.h,结构体在.c里面例化,例化的外部声明也放到.h里。

出0入0汤圆

 楼主| 发表于 2019-2-21 19:42:57 | 显示全部楼层
hecat 发表于 2019-2-21 19:33
把结构体定义和例化分开。结构体定义放到.h,结构体在.c里面例化,例化的外部声明也放到.h里。 ...

像你所说的试了,不行

出870入263汤圆

发表于 2019-2-21 19:45:32 | 显示全部楼层
一般会在"ringBuffer.h"文件里包含"clink.h"文件;
你不想这样做的话,只要把你出错的文件中的两个include位置换一下就行:
#include "clink.h"
#include "ringBuffer.h"

出0入8汤圆

发表于 2019-2-21 19:48:03 来自手机 | 显示全部楼层
这个循环嵌套的问题一直也困扰着我,我的做法是一个文件。

出0入0汤圆

 楼主| 发表于 2019-2-21 19:48:58 | 显示全部楼层
armstrong 发表于 2019-2-21 19:45
一般会在"ringBuffer.h"文件里包含"clink.h"文件;
你不想这样做的话,只要把你出错的文件中的两个include ...

兄弟,在“ringBuf.h”文件 只包含“clink.h”文件,没有其他东西了,所以顺序不是问题

出0入0汤圆

 楼主| 发表于 2019-2-21 19:51:50 | 显示全部楼层
icoyool 发表于 2019-2-21 19:48
这个循环嵌套的问题一直也困扰着我,我的做法是一个文件。

我现在是多个文件带参传进去,现在好了,每个文件都有定义typedef
我只是暂时屏蔽了部分代码,单独来调试这两个文件,我看了STM32的库也是这样用也可以,就是我自己写的不行

出0入0汤圆

发表于 2019-2-21 21:50:11 | 显示全部楼层
感觉这种奇怪的问题最不好找原因了,持续关注

出0入8汤圆

发表于 2019-2-22 00:03:33 来自手机 | 显示全部楼层
用/p编译参数,看看预处理之后的代码是什么样的

出0入0汤圆

发表于 2019-2-22 00:51:55 | 显示全部楼层
很简单,顺序搞错了
#include "clink.h"
#include "ringBuffer.h"
调换一下就可以了!!!
所有东西的使用都是先声明!!!

出0入0汤圆

发表于 2019-2-24 18:03:05 | 显示全部楼层
头文件只声明结构体和外部变量名,在c文件中定义一次变量

出0入0汤圆

 楼主| 发表于 2019-2-24 21:51:44 | 显示全部楼层
mcu5i51 发表于 2019-2-24 18:03
头文件只声明结构体和外部变量名,在c文件中定义一次变量

那我要在其他文件中的函数参数要传入这个自己定义类型,就出问题了

出0入0汤圆

发表于 2019-2-24 21:54:13 | 显示全部楼层
OneRain 发表于 2019-2-22 00:51
很简单,顺序搞错了
#include "clink.h"
#include "ringBuffer.h"

学习聊,细节很重要。

出0入0汤圆

发表于 2019-2-24 21:55:06 | 显示全部楼层
把红圈里的Elink去掉试试呢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2019-2-24 22:29:23 | 显示全部楼层
go2deathward 发表于 2019-2-24 21:55
把红圈里的Elink去掉试试呢

不关这个事

出0入0汤圆

发表于 2019-2-25 08:22:53 | 显示全部楼层
mii 发表于 2019-2-24 21:51
那我要在其他文件中的函数参数要传入这个自己定义类型,就出问题了

你定义了多个相同的变量

出0入0汤圆

发表于 2019-2-25 08:35:14 | 显示全部楼层
尽可能不要在.h文件中包含.h文件,很容易一不小心就变成嵌套包含导致声明文件无效。
可以将声明集中放置于一个文件中就可以了。

出0入0汤圆

发表于 2019-2-25 09:17:50 | 显示全部楼层
在 ringBuffer.h  里面最开始的地方包含#include "clink.h"

出0入0汤圆

发表于 2019-2-25 09:24:00 | 显示全部楼层
go2deathward 发表于 2019-2-24 21:55
把红圈里的Elink去掉试试呢

我觉得您说的对!

出0入0汤圆

发表于 2019-2-25 09:37:17 来自手机 | 显示全部楼层
mii 发表于 2019-2-21 19:51
我现在是多个文件带参传进去,现在好了,每个文件都有定义typedef
我只是暂时屏蔽了部分代码,单独来调试 ...

不如删掉无关东西发上来看看

出0入0汤圆

发表于 2019-2-25 09:44:53 | 显示全部楼层

您是觉得不关这事,还是试过了去掉这个还是编译不过?

出0入0汤圆

 楼主| 发表于 2019-2-25 10:11:05 | 显示全部楼层
感谢各位大神的意见,但还是再表达一次我现在的现象。主要增加一些图片来讨论会比较直观一点。








本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2019-2-25 10:11:49 | 显示全部楼层
go2deathward 发表于 2019-2-25 09:44
您是觉得不关这事,还是试过了去掉这个还是编译不过?

试过了,具体现象可以看我23楼的回复,谢谢

出0入0汤圆

 楼主| 发表于 2019-2-25 10:12:06 | 显示全部楼层
huangqi412 发表于 2019-2-25 09:37
不如删掉无关东西发上来看看

嗯,感谢。请看我的23楼回复

出0入0汤圆

 楼主| 发表于 2019-2-25 10:12:44 | 显示全部楼层
y1z2f4 发表于 2019-2-25 09:24
我觉得您说的对!

然而并不是这样可以解决,试过没效果

出0入0汤圆

 楼主| 发表于 2019-2-25 10:14:12 | 显示全部楼层
farfar 发表于 2019-2-25 08:35
尽可能不要在.h文件中包含.h文件,很容易一不小心就变成嵌套包含导致声明文件无效。
可以将声明集中放置于 ...

我觉得你这个回答是最有可能 的了,我要花时间验证一下

出0入0汤圆

 楼主| 发表于 2019-2-25 10:14:56 | 显示全部楼层
eovlon 发表于 2019-2-25 09:17
在 ringBuffer.h  里面最开始的地方包含#include "clink.h"

这应该是TYPE作用域的问题,详细现象看我23楼

出0入0汤圆

发表于 2019-2-25 10:19:49 | 显示全部楼层
是不是头文件交叉相互包含引起的?

出0入0汤圆

发表于 2019-2-25 10:21:21 | 显示全部楼层
mii 发表于 2019-2-25 10:11
感谢各位大神的意见,但还是再表达一次我现在的现象。主要增加一些图片来讨论会比较直观一点。

你试下,将#include "ringBuffer.h"放在clink定义的下面,看是否能编过
h中包含h,可能会出现问题

出0入0汤圆

 楼主| 发表于 2019-2-25 10:36:43 | 显示全部楼层
go2deathward 发表于 2019-2-25 10:21
你试下,将#include "ringBuffer.h"放在clink定义的下面,看是否能编过
h中包含h,可能会出现问题 ...



是如你所说,改变位置后是可以编译通过,就是看着难受。

在STM32的库文件中很多都是定义 在.H文件中,但他在我编写程序调用时也没提示过这种情况。

就是想知道人家是怎样实现的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2019-2-25 10:38:22 | 显示全部楼层
zhugean 发表于 2019-2-25 10:19
是不是头文件交叉相互包含引起的?

我猜想也是,但为什么STM32库里文件很多这种写法,但人家就没有出现这种情况。我们平时在什么文件调用声明都可以

出0入0汤圆

发表于 2019-2-25 10:42:36 | 显示全部楼层
mii 发表于 2019-2-25 10:36
是如你所说,改变位置后是可以编译通过,就是看着难受。

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

大概官方的是没有交叉包含吧

出0入0汤圆

发表于 2019-2-25 11:08:07 | 显示全部楼层
mii 发表于 2019-2-25 10:11
感谢各位大神的意见,但还是再表达一次我现在的现象。主要增加一些图片来讨论会比较直观一点。

把clink.h中的第7行挪到第17行,包你编译通过。

出0入0汤圆

发表于 2019-2-25 11:10:25 | 显示全部楼层
mii 发表于 2019-2-25 10:11
感谢各位大神的意见,但还是再表达一次我现在的现象。主要增加一些图片来讨论会比较直观一点。

我感觉在Clink.h中把 ringBuffer.h头文件一行删掉你也可以编译通过。

出0入0汤圆

发表于 2019-2-25 14:02:31 | 显示全部楼层
本帖最后由 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文件开头的使用。

出0入0汤圆

发表于 2019-2-27 09:58:02 | 显示全部楼层
这个问题同样一直困扰我,我目前是所有的头文件包含在一个文件中,然后注意头文件的顺序。
但是如果有多个结构体在多个头文件中,然后还有一个函数形参包含多个结构体,这个时候编译
大多会编译不通过,这个时候不知如何解决声明在前,使用在后的问题?

出0入0汤圆

发表于 2019-2-27 15:34:23 | 显示全部楼层
zhikunWang 发表于 2019-2-27 09:58
这个问题同样一直困扰我,我目前是所有的头文件包含在一个文件中,然后注意头文件的顺序。
但是如果有多个 ...

文件包含可以嵌套,但不能递归(直接或间接包含自身)。
因为在一个翻译单元(即一个C文件)中类型声明不能重复,所以H头文件最好分成三类:类型声明变量/函数声明配置文件。这样不仅结构清晰层次分明,而且能很好处理你的问题。楼主的主要问题就是把“类型声明”和“变量/函数声明”混在一起,把类型声明独立出来弄个单独头文件就行了。
  
类似这样的:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 00:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表