Browse DevX
Sign up for e-mail newsletters from DevX

Tip of the Day
Language: C++
Expertise: Beginner
Sep 3, 1999



Building the Right Environment to Support AI, Machine Learning and Deep Learning

Passing More Arguments to a Callback Function

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)
      //perform case-insensitive comparison
Danny Kalev
Comment and Contribute






(Maximum characters: 1200). You have 1200 characters left.



Thanks for your registration, follow us on our social networks to keep up-to-date