#include <stdio.h>

typedef void FUNC(const char *str);
typedef FUNC *FUNCPTR;

void func(const char *str)
{
    printf("func(%s)\n", str);
}

void foo(FUNC *fn) { fn("foo"); }
void bar(FUNCPTR fn) { fn("bar"); }
void foobar(FUNC fn) { fn("foobar"); }  // OK

int main()
{
    FUNC *fn1 = func;
    FUNCPTR fn2 = func;
//  FUNC fn3 = func;    // エラー

    foo(func);
    bar(func);
    foobar(func);
    fn1("fn1");
    fn2("fn2");
//  fn3("fn3");

    return 0;
}
