Explain typedef for function used in qsort library

2019-02-25 16:16发布

问题:

I am using qsort library function to sort an array of structure elements, while searching on the Internet I found a resource: INFO: Sorting Structures with the C qsort() Function @ support.microsoft.

I understand that qsort function requires to be typecast by generic pointers.

However I am not able to get this line:

typedef int (*compfn) (const void*, const void*);

Which has been declared, and its subsequent call:

qsort((void *) &array,              // Beginning address of array
      10,                           // Number of elements in array
      sizeof(struct animal),        // Size of each element
      (compfn)compare               // Pointer to compare function
 );
  1. How is typedef behaving, I mean what exactly have we typedeffed int (*compfn) or int (compfn)?
  2. If the former, then shouldn't the call be (*compfn)?

回答1:

Syntax:

typedef  int (*compfn)  (const void*, const void*);
  ^      ^       ^            ^          ^
  | return type  |               arguments type
  |             new type name 
  defining new type

compfn is a new user defined type defined by typedef keyword,

So, you have exactly typedefded int (*)(const void*, const void*); to comfn using the syntax I described above.

A declaration:

 compfn  fun; // same as: int (*fun)  (const void*, const void*);

means fun is a function pointer that takes two arguments of const void* types and returns int.

Suppose you have a function like:

int xyz  (const void*, const void*);    

then you can assign xyz address to fun.

fun = &xyz; 

At calling qsort():

In expression (compfn)compare, you are typecasting a function compare to (compfn) type function.

A doubt:

shouldn't the call be (*compfn).

No, its type name not function name.

Note: if you just writing int (*compfn) (const void*, const void*); without typedef then comfn will be a pointer to a function that returns int and take two arguments of type const void*



回答2:

The typedef declaration creates an alias for a specific type. This means it can be used as any other type in declarations and definitions.

So if you have e.g.

typedef int (*compfn)(const void*, const void*);

Then you can declare a variable or argument using only compfn instead of the whole function pointer declaration. E.g. these two declarations are equal:

compfn function_pointer_1;
int (*function_pointer_2)(const void*, const void*);

Both creates a function pointer variable, and the only difference is the name of the variable name.

Using typedef is common when you have long and/or complicated declarations, to easy both your writing of such declarations and to make it easier to read.



回答3:

It is a type of a function pointer. The function which is being pointed to returns int and accepts two const void* parameters.