我试图找出如何声明一个函数,该函数返回一个返回函数的函数的指针。这是一个循环问题,我不知道这是否可以在c中完成。这是我正在尝试做的一个说明性示例(它不起作用):
typedef (*)(void) (*fp)(void);
fp funkA(void) {
return funkB;
}
fp funkB(void) {
return funkA;
}
答案 0 :(得分:6)
要在C中创建如此完全循环的类型,您必须使用struct
(或union
)。在C99:
typedef struct fpc {
struct fpc (*fp)(void);
} fpc;
fpc funkB(void);
fpc funkA(void) {
return (fpc){ funkB };
}
fpc funkB(void) {
return (fpc){ funkA };
}
在C89中,你没有复合文字,所以你必须这样做:
fpc funkA(void) {
fpc rv = { funkB };
return rv;
}
fpc funkB(void) {
fpc rv = { funkA };
return rv;
}
答案 1 :(得分:4)
试试这个:
void (*(*f())())()
我总是觉得cdecl值得为这些任务付出代价。对上述内容的查询是
declare f as function returning pointer to function returning pointer to function returning void
答案 2 :(得分:1)
这个怎么样?
typedef void (*rfp)(void);
typedef rfp (*fp)(void);
这不是完全循环的,但非常简单,可以为你服务。
完整的解决方案可以在“Guru of the Week”上找到完整的解释,并且是:
struct FuncPtr_;
typedef FuncPtr_ (*FuncPtr)();
struct FuncPtr_
{
FuncPtr_( FuncPtr pp ) : p( pp ) { }
operator FuncPtr() { return p; }
FuncPtr p;
};
FuncPtr_ f() { return f; } // natural return syntax
int main()
{
FuncPtr p = f(); // natural usage syntax
p();
}
不是那么简单,而是正确和便携......
答案 3 :(得分:0)
我尝试了以下内容,这确实避免了循环问题,因此在上下文中是错误的(并且需要转换);但是,如果你不需要真正的循环或严格,它就可以了
#include <stdio.h>
typedef void *(*fp)(void);
fp funcB(void);
fp funcA(void)
{
printf("funcA %p\n", funcB);
return (fp)funcB;
}
fp funcB(void)
{
printf("func B %p\n", funcA);
return (fp)funcA;
}
int main()
{
printf("%p %p\n", funcA, funcB);
printf("%p %p\n", funcA(), funcB());
return 0;
}