+ -
当前位置:首页 → 问答吧 → 如何实现一个宏,判断函数指针是否存在并直接调用

如何实现一个宏,判断函数指针是否存在并直接调用

时间:2010-06-30

来源:互联网

本帖最后由 jetking 于 2010-06-30 16:46 编辑

例如
  1. typedef struct {
  2.    void (*cb_1)(int arg1);
  3.    void (*cb_2)(int arg1, int arg2);
  4. } CallBack;
复制代码
CallBack由用户定义,我这端调用回调时,判断回调是否为非NULL,然后调用回调。
小弟不才,不知道如何实现一个宏,在一行上判断并调用回调。

原来的:
  1. CallBack user_cb;
  2. if (user_cb.cb_1 != NULL) {
  3.      user_cb.cb_1(my_arg1);
  4. }
复制代码
谢谢大家!

作者: jetking   发布时间: 2010-06-30

#define CallFun(a, ar1, ar2)  ((a->cb_1 && a->cb_1(ar1)) && (a->cb_2 && a->cb_2(ar1, ar2)));

这样可以么

作者: benjiam   发布时间: 2010-06-30

sorry,可能前面没说清楚
回调函数不是同时执行的。而且cb_1和cb_2在参数上是独立的。

我应该需要这么一个宏,在调用的时候:
CALLFUNC(user_cb, cb_1)(my_arg);
CALLFUNC(user_cb, cb_2)(arg1, arg2);

之前不想用上述宏的写法禁锢大家的想法,所以就没列出例子。

作者: jetking   发布时间: 2010-06-30

回复 jetking

只能把函数的参数也放到前面的括号中

作者: cugb_cat   发布时间: 2010-06-30

#define CALLFUNC(obj, c, ...) (obj.c != NULL ? 0 : obj.c(##__VA_ARGS__))

gcc适用

作者: cugb_cat   发布时间: 2010-06-30

#define CALLFUNC(user_cb, cb_1 ,...);                                      \
    if ((user_cb)->cb_1) (user_cb)->cb_1(  __VA_ARGS__);


nginx
里面的 改改就可以了 哈哈
但是支持c99

作者: benjiam   发布时间: 2010-06-30