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:



Code:
 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:



Code:
 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:


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