devxlogo

Passing More Arguments to a Callback Function

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)    }    else        {       //perform case-insensitive comparison    }}
devxblackblue

About Our Editorial Process

At DevX, we’re dedicated to tech entrepreneurship. Our team closely follows industry shifts, new products, AI breakthroughs, technology trends, and funding announcements. Articles undergo thorough editing to ensure accuracy and clarity, reflecting DevX’s style and supporting entrepreneurs in the tech sphere.

See our full editorial policy.

About Our Journalist