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() Functio
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*
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.
It is a type of a function pointer. The function which is being pointed to returns int
and accepts two const void*
parameters.