Using typedef

It might be handy to use a typedef instead of declaring the function pointer each time by hand.

The syntax for declaring a typedef for a function pointer is:

typedef returnType (*name)(parameters);

Example:

Posit that we have a function, sort, that expects a function pointer to a function compare such that:

compare - A compare function for two elements which is to be supplied to a sort function.

“compare” is expected to return 0 if the two elements are deemed > equal, a positive value if the first element passed is “larger” in some > sense than the latter element and otherwise the function returns a > negative value (meaning that the first element is “lesser” than the latter).

Without a typedef we would pass a function pointer as an argument to a function in the following manner:

void sort(int (*compare)(const void *elem1, const void *elem2)) { 
    /* inside of this block, the function is named "compare" */
}

With a typedef, we’d write:

typedef int (*compare_func)(const void *, const void *);

and then we could change the function signature of sort to:

void sort(compare_func func) { 
    /* In this block the function is named "func" */
}

both definitions of sort would accept any function of the form

int compare(const void *arg1, const void *arg2) {
    /* Note that the variable names do not have to be "elem1" and "elem2" */
}

Function pointers are the only place where you should include the pointer property of the type, e.g. do not try to define types like typedef struct something_struct *something_type. This applies even for a structure with members which are not supposed to accessed directly by API callers, for example the stdio.h FILE type (which as you now will notice is not a pointer).

Taking context pointers.

A function pointer should almost always take a user-supplied void * as a context pointer.