RT-Thread--宏 RT_OBJECT_HOOK_CALL

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)

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值