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 }}