jiuhao2019 发表于 2020-9-27 08:46:36

请教struct的一种用法

在FreeRTOS的task.h,
<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里,
<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语句而写的吗.

eric2013 发表于 2020-9-27 10:23:44

可以在程序里面把struct tskTaskControlBlock;注释掉看看是否正常,如果正常,那就不是。

eric2013 发表于 2020-9-27 10:44:07

做了一个类似的结构体定义,这种玩法确实没问题。

struct tskTaskControlBlock;可以删掉,没用。

jiuhao2019 发表于 2020-9-27 11:02:35

eric2013 发表于 2020-9-27 10:44
做了一个类似的结构体定义,这种玩法确实没问题。

struct tskTaskControlBlock;可以删掉,没用。

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

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

eric2013 发表于 2020-9-27 11:20:44

jiuhao2019 发表于 2020-9-27 11:02
是的.确实删掉,编译OK的.
那么第二问题的推测否定了.



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

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

jiuhao2019 发表于 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;

eric2013 发表于 2020-9-27 11:57:05

jiuhao2019 发表于 2020-9-27 11:51
typedef struct tskTaskControlBlock * TaskHandle_t;
我不懂的地方是这个定义中的结构体类型没有提前定义 ...
当前我仅测试了FreeRTOS类似的定义方式,没问题,其它定义方式自己研究下吧。

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

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


gooood 发表于 2020-10-17 16:29:44

你的猜测是对的,结构体声明和定义也可以分开,就和函数一样。

jiuhao2019 发表于 2020-10-24 10:59:03

gooood 发表于 2020-10-17 16:29
你的猜测是对的,结构体声明和定义也可以分开,就和函数一样。

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

gooood 发表于 2020-12-17 15:47:51

jiuhao2019 发表于 2020-10-24 10:59
如果你的说的结论是对的. 那么把结构体声明删掉了, 也可以编译通过.就说不通了.

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

snakeemail 发表于 2020-12-30 17:23:05

哈哈哈,我在这里卡了好久。这里申明的是一个指针,指针占用的位置是固定的,所以编译器看到,就挖一个4字节的坑,等运行的时候,才有实际作用。
typedef struct tskTaskControlBlock * TaskHandle_t;
页: [1]
查看完整版本: 请教struct的一种用法