如何将一个带函数指针的函数声明为与函数具有相同签名的函数作为参数?
在gcc中,什么不起作用
foo_t * f(bar_t const *, typeof(f) *);
或
typedef foo_t (* f_t)(bar_t const *, f_t);
f_t f;
如果可能,我不想转发void *
并返回。
答案 0 :(得分:2)
您可以使用前向声明的结构来破坏类型递归(这与C ++中的仿函数或可调用对象大致类似)
struct Func;
typedef foo_t *(*FuncFunc)(bar_t const *b, struct Func *);
struct Func { FuncFunc callee; };
foo_t * f(bar_t const *b, struct Func *func) {
Func nextfunc = { f };
return func->callee(b, nextfunc); /* <-- infinite recursion */
}
使用void / cast和varargs都是hacks - 上面至少保留了类型信息。