我试图声明一个带有与参数相同类型的函数的函数。
void rec(void(*f)(void(*)(void(*)(...))))
{
f(f);
}
我最终做了一次递归尝试。
您始终可以从void*
投射。
void rec(void* f)
{
((void(*)())f)(f);
}
但它不是类型安全的
我尝试使用typedef
:
typedef void(*RecFunc)(RecFunc);
但不编译。
有可能吗?
答案 0 :(得分:5)
你无法做你想做的事。正如您所注意到的,您最终尝试进行递归typedef
。这种语言不支持。
答案 1 :(得分:4)
您不能以一致的方式直接执行此操作,但是如果将函数指针放在包装器结构中,则可以这样做:
struct F;
typedef void(*RecFunc)(struct F *);
struct F {
RecFunc f;
};
我们首先声明结构,以便typedef可以使用它。然后我们定义结构以包含函数指针。在这种情况下,resursive函数类型被定义为指向struct F
,但如果它采用struct F
的实例,它仍然可以工作。
然后你可以像这样使用它:
void f(struct F *sf)
{
static int x=5;
if (x) {
printf("x=%d\n",x);
x--;
sf->f(&(struct F){f});
}
}
int main()
{
f(&(struct F){f});
return 0;
}
输出:
x=5
x=4
x=3
x=2
x=1