请教一个再入函数的问题,我的形参使用了结构指针,会有问题吗?
正常的书本介绍是不能使用全局或者静态变量,形参使用指针是不是也算全局变量呢,这个时候形参的传入应该是堆栈保护的吧?比如这样
BOOL fEmptyQueue_BYTE(QUEUE_BYTE_TypeDef *sQueue) reentrant {
returnsQueue->bhQlength == 0 ? TRUE : FAIL;
}
BOOL fFullQueue_BYTE(QUEUE_BYTE_TypeDef *sQueue) reentrant {
return sQueue->bhQlength == sQueue->bhMaxSize ? TRUE : FAIL;
}
找不到合适版块来请教这个问题,不合适请移送相关版块。
(1)对于C251/C51,一个函数声明了函数重入“reentrant”后,形参就不是全局变量了,每次调用都会在函数堆栈中分配新地址空间,受到函数重入保护的。
(2)针对你的具体例子而言,形参是一个指针(不是结构本身!),不是全局变量,每次调用分配4字节/3字节的新堆栈空间。
(3)但是函数调用时形参指针指向的结构必须是一个可访问实体结构,这个实体结构通常是一个全局结构变量、上层函数的结构变量或者是一个已经指向实体结构的指针。只有这样函数的操作才能针对一个具体的实体完成。
杨为民 发表于 2023-10-14 12:34
(1)对于C251/C51,一个函数声明了函数重入“reentrant”后,形参就不是全局变量了,每次调用都会在函数堆 ...
“(3)但是函数调用时形参指针指向的结构必须是一个可访问实体结构,这个实体结构通常是一个全局结构变量、上层函数的结构变量或者是一个已经指向实体结构的指针。只有这样函数的操作才能针对一个具体的实体完成。”
谢谢杨老师,其实就担心这些,以前队列用的很多,不用应用模块直接copy异名函数,现在觉得挺麻烦的。
很多结构相同的实体,每个实体都是几十上百个成员,具体估计还是需要看编译器的处理,从C语言本身来说这样的访问又似乎没有问题,毕竟只要KEIL再入时用的模拟堆栈保护形参指针应该就可以了。
页:
[1]