RT-Thread
中的宏 RT_OBJECT_HOOK_CALL
作用
调用内核对象绑定的钩子函数
原型
#define RT_OBJECT_HOOK_CALL(func, argv) \
do { if ((func) != RT_NULL) func argv; } while (0)
调用示例
RT_OBJECT_HOOK_CALL(rt_object_attach_hook, (object));
解析
do { if ((func) != RT_NULL) func argv; } while (0)
乍一看这个语句好像有问题,func
是函数指针,argv
是函数参数,为啥函数调用的时候函数参数和函数名之间不加括号呢?
因为内核中在引用这个宏的时候第二个参数都加了括号,例如
RT_OBJECT_HOOK_CALL(rt_object_attach_hook, (object));
宏展开就是
do
{
if(rt_object_attach_hook != RT_NULL)
rt_object_attach_hook(object);
}while(0)
内核中包含很多这样的示例:
RT_OBJECT_HOOK_CALL(rt_object_trytake_hook, (&(sem->parent.parent)));
RT_OBJECT_HOOK_CALL(rt_object_take_hook, (&(event->parent.parent)));
RT_OBJECT_HOOK_CALL(rt_object_put_hook, (&(sem->parent.parent)));
所以函数名和函数参数之间的括号是在调用的时候加的。
优缺点
- 优点:暂未发现
- 缺点:容易产生疑惑,让人以为是
bug
其它类似的宏
#define RT_DEBUG_LOG(type, message) \
do \
{ \
if (type) \
rt_kprintf message; \
} \
while (0)