请教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语句而写的吗.
可以在程序里面把struct tskTaskControlBlock;注释掉看看是否正常,如果正常,那就不是。 做了一个类似的结构体定义,这种玩法确实没问题。
struct tskTaskControlBlock;可以删掉,没用。 eric2013 发表于 2020-9-27 10:44
做了一个类似的结构体定义,这种玩法确实没问题。
struct tskTaskControlBlock;可以删掉,没用。
是的.确实删掉,编译OK的.
那么第二问题的推测否定了.
BTW, 引用的部分怎么显示不正常了. jiuhao2019 发表于 2020-9-27 11:02
是的.确实删掉,编译OK的.
那么第二问题的推测否定了.
TaskHandle_t不正常吗,这个是句柄专用的,句柄定义,任务创建返回值使用没问题。
注意使用范围。按照这种的定义使用就没问题,你是这么测试的吗 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;
jiuhao2019 发表于 2020-9-27 11:51
typedef struct tskTaskControlBlock * TaskHandle_t;
我不懂的地方是这个定义中的结构体类型没有提前定义 ...
当前我仅测试了FreeRTOS类似的定义方式,没问题,其它定义方式自己研究下吧。
这种东西貌似没什么好研究的,就是这么个规则,知道编译器能识别,能用即可。
就聊这么多吧,还有什么问题,跟其他坛友聊聊。
你的猜测是对的,结构体声明和定义也可以分开,就和函数一样。 gooood 发表于 2020-10-17 16:29
你的猜测是对的,结构体声明和定义也可以分开,就和函数一样。
如果你的说的结论是对的. 那么把结构体声明删掉了, 也可以编译通过.就说不通了. jiuhao2019 发表于 2020-10-24 10:59
如果你的说的结论是对的. 那么把结构体声明删掉了, 也可以编译通过.就说不通了.
看一下这个 https://www.cnblogs.com/zl1991/p/7910834.html 哈哈哈,我在这里卡了好久。这里申明的是一个指针,指针占用的位置是固定的,所以编译器看到,就挖一个4字节的坑,等运行的时候,才有实际作用。
typedef struct tskTaskControlBlock * TaskHandle_t;
页:
[1]