typedef bool (*Foo)(Foo a, Foo b);
How do you declare a function pointer that accepts itself in its parameters?
You can't express this in the type system. Although there's nothing fundamentally wrong in this, it simplifies things by eliminating cycles within the type system. It strongly reminds me of Axiom of Foundation.
What you can do is pass a void pointer and cast it to your type:
typedef bool (*Foo)(void* a, void* b);
bool f(void* a, void* b)
{
return ((Foo)a)(a,b);
}