Callback functions have a fixed signature so you cannot alter the number or type of the arguments it takes. For example, the standard qsort() function takes a pointer to a function that has the following signature:
int (cmp*)(const void *, const void *) //user's comparison function
This signature allows you to pass exactly two arguments to your custom-made comparison function. However, suppose that the comparison function has to compare strings and you want to pass a third argument to indicate whether the comparison should be case-sensitive or not. You cannot simply add a third argument to the function call, because the compiler will complain about it (don't even think about casting the function pointer; see this tip). Instead, you can define a struct that contains two members:
struct Comparison
{
char *name;
bool caseSensitive;
};
Now instead of passing a pointer to char as the second argument, you can pass a pointer to an instance of that struct. The comparison function will unpack the struct and compare the strings accordingly:
int MyCompareFunc(const void *pfirst, const void * psecond)
{
const Comparison * pcmp = (Comparison *) psecond;
const char * pstr1 = (const char *) pfirst;
const char * pstr2 = pcmp->name; //extract string from struct
if (pcmp->caseSensitive == true) //the second field of the struct
{
return strcmp(pstr1, pstr2)
}
else
{
//perform case-insensitive comparison
}
}