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);
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).
A function pointer should almost always take a user-supplied void * as a context pointer.