C中的循环函数指针问题

时间:2011-07-22 07:15:18

标签: c function pointers

我试图找出如何声明一个函数,该函数返回一个返回函数的函数的指针。这是一个循环问题,我不知道这是否可以在c中完成。这是我正在尝试做的一个说明性示例(它不起作用):

typedef (*)(void) (*fp)(void);

fp funkA(void) {
    return funkB;
}

fp funkB(void) {
    return funkA;
}

4 个答案:

答案 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;
}