硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2437|回复: 10
收起左侧

请教struct的一种用法

[复制链接]

2

主题

5

回帖

11

积分

新手上路

积分
11
发表于 2020-9-27 08:46:36 | 显示全部楼层 |阅读模式
在FreeRTOS的task.h,
  1. <div>struct tskTaskControlBlock;     /* The old naming convention is used to prevent breaking kernel aware debuggers. */</div><div>typedef struct tskTaskControlBlock * TaskHandle_t;</div>
复制代码
在task.c里,
  1. <div><div>typedef struct tskTaskControlBlock       /* The old naming convention is used to prevent breaking kernel aware debuggers. */</div><div>{</div></div><div>    /*省略N多结构体成员*/</div><div>} tskTCB;</div>
复制代码
我有两个不懂的.
1, struct tskTaskControlBlock;     这是什么骚操作.
2,typedef struct tskTaskControlBlock * TaskHandle_t; 这个语句不是会报错吗, 因为结构体类型在这之前未定义(因为躲在task.c文件里,这里不知道). 但是实际没报错. 那么推测1语句就是为了2语句而写的吗.
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2020-9-27 10:23:44 | 显示全部楼层
可以在程序里面把struct tskTaskControlBlock;注释掉看看是否正常,如果正常,那就不是。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2020-9-27 10:44:07 | 显示全部楼层
做了一个类似的结构体定义,这种玩法确实没问题。

struct tskTaskControlBlock;可以删掉,没用。
回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2020-9-27 11:02:35 | 显示全部楼层
eric2013 发表于 2020-9-27 10:44
做了一个类似的结构体定义,这种玩法确实没问题。

struct tskTaskControlBlock;可以删掉,没用。

是的.确实删掉,编译OK的.
那么第二问题的推测否定了.

BTW, 引用的部分怎么显示不正常了.
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2020-9-27 11:20:44 | 显示全部楼层
jiuhao2019 发表于 2020-9-27 11:02
是的.确实删掉,编译OK的.
那么第二问题的推测否定了.

TaskHandle_t不正常吗,这个是句柄专用的,句柄定义,任务创建返回值使用没问题。

注意使用范围。按照这种的定义使用就没问题,你是这么测试的吗
回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2020-9-27 11:51:20 | 显示全部楼层
typedef struct tskTaskControlBlock * TaskHandle_t;
我不懂的地方是这个定义中的结构体类型没有提前定义好.却不报错.
比如在定义TaskHandle_t之前, 先 typedef struct tskTaskControlBlock{...} str_t;
或者不用typedef, 直接 struct tskTaskControlBlock{...};
再来typedef str_t *TaskHandle_t; 或者typedef struct tskTaskControlBlock *TaskHandle_t;
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2020-9-27 11:57:05 | 显示全部楼层
jiuhao2019 发表于 2020-9-27 11:51
typedef struct tskTaskControlBlock * TaskHandle_t;
我不懂的地方是这个定义中的结构体类型没有提前定义 ...

当前我仅测试了FreeRTOS类似的定义方式,没问题,其它定义方式自己研究下吧。

这种东西貌似没什么好研究的,就是这么个规则,知道编译器能识别,能用即可。

就聊这么多吧,还有什么问题,跟其他坛友聊聊。


回复

使用道具 举报

2

主题

14

回帖

20

积分

新手上路

积分
20
发表于 2020-10-17 16:29:44 | 显示全部楼层
你的猜测是对的,结构体声明和定义也可以分开,就和函数一样。
回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2020-10-24 10:59:03 | 显示全部楼层
gooood 发表于 2020-10-17 16:29
你的猜测是对的,结构体声明和定义也可以分开,就和函数一样。

如果你的说的结论是对的. 那么把结构体声明删掉了, 也可以编译通过.就说不通了.
回复

使用道具 举报

2

主题

14

回帖

20

积分

新手上路

积分
20
发表于 2020-12-17 15:47:51 | 显示全部楼层
jiuhao2019 发表于 2020-10-24 10:59
如果你的说的结论是对的. 那么把结构体声明删掉了, 也可以编译通过.就说不通了.

看一下这个 https://www.cnblogs.com/zl1991/p/7910834.html
回复

使用道具 举报

41

主题

215

回帖

338

积分

高级会员

积分
338
发表于 2020-12-30 17:23:05 | 显示全部楼层
哈哈哈,我在这里卡了好久。这里申明的是一个指针,指针占用的位置是固定的,所以编译器看到,就挖一个4字节的坑,等运行的时候,才有实际作用。
typedef struct tskTaskControlBlock * TaskHandle_t;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 17:10 , Processed in 0.178975 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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