Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I typedef a function pointer that takes a function of its own type as an argument?

Example: A function that takes a function (that takes a function (that ...) and an int) and an int.

typedef void(*Func)(void (*)(void (*)(...), int), int);

It explodes recursively where (...). Is there a fundamental reason this can't be done or is there another syntax? It seems to me it should be possible without a cast. I'm really trying to pass a dispatch-table but I could figure that out if I could just pass this one type.

like image 996
Samuel Danielson Avatar asked May 03 '09 04:05

Samuel Danielson


2 Answers

You can wrap the function pointer in a struct:

struct fnptr_struct;
typedef void (*fnptr)(struct fnptr_struct *);
struct fnptr_struct {
  fnptr fp;
};

I'm not sure if this is an improvement on casting. I suspect that it's impossible without the struct because C requires types to be defined before they are used and there's no opaque syntax for typedef.

like image 97
Dave Avatar answered Nov 17 '22 20:11

Dave


It's impossible to do directly. Your only options are to make the function pointer argument accept unspecified arguments, or to accept a pointer to a structure containing the function pointer, as Dave suggested.

// Define fnptr as a pointer to a function returning void, and which takes one
// argument of type 'pointer to a function returning void and taking
// an unspecified number of parameters of unspecified types'
typedef void (*fnptr)(void (*)());
like image 6
Adam Rosenfield Avatar answered Nov 17 '22 19:11

Adam Rosenfield