解释qsort库中使用的函数的typedef

Dre*_*f D 2 c pointers typedef function-pointers qsort

我正在使用qsort库函数对结构元素数组进行排序,而在Internet上搜索时我找到了一个资源:INFO:使用C qsort()函数 @support.microsoft 对结构进行排序.

我知道qsort函数需要通用指针进行类型转换.

但是我无法得到这一行:

typedef int (*compfn) (const void*, const void*);
Run Code Online (Sandbox Code Playgroud)

已宣布的内容及其随后的致电:

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
 );
Run Code Online (Sandbox Code Playgroud)
  1. 如何typedef表现,我的意思是到底有没有我们typedeffed int (*compfn)int (compfn)
  2. 如果是前者,那么不应该打电话(*compfn)吗?

Gri*_*han 8

句法:

typedef  int (*compfn)  (const void*, const void*);
  ^      ^       ^            ^          ^
  | return type  |               arguments type
  |             new type name 
  defining new type
Run Code Online (Sandbox Code Playgroud)

compfntypetypedef关键字定义的新用户定义,

所以,你究竟typedefded int (*)(const void*, const void*);comfn使用我上述的语法.

声明:

 compfn  fun; // same as: int (*fun)  (const void*, const void*);
Run Code Online (Sandbox Code Playgroud)

means fun是一个函数指针,它接受两个const void*类型和返回的参数int.

假设你有一个像这样的函数:

int xyz  (const void*, const void*);    
Run Code Online (Sandbox Code Playgroud)

然后你可以分配xyz地址fun.

fun = &xyz; 
Run Code Online (Sandbox Code Playgroud)

致电qsort():

在表达式中(compfn)compare,您要对类型函数compare进行(compfn)类型转换.

一个疑问:

不应该打电话(*compfn).

不,它的类型名称不是函数名称.

注意:如果你只是在int (*compfn) (const void*, const void*);没有typedef的情况下编写,那么comfn它将是一个指向函数的指针,该函数返回int并获取两个类型的参数const void*

  • @DrefD你有正确的typedefded`int(*)(const void*,const void*);````comfn`使用我上面描述的语法. (2认同)