簡體   English   中英

解釋qsort庫中使用的函數的typedef

[英]Explain typedef for function used in qsort library

我正在使用qsort庫函數對結構元素數組進行排序,而在Internet上搜索時我找到了一個資源: INFO:使用C qsort()函數 @support.microsoft 對結構進行排序

我知道qsort函數需要通用指針進行類型轉換。

但是我無法得到這一行:

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

已宣布的內容及其隨后的致電:

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. typedef是如何表現的,我的意思是我們究竟有什么類型的intdeffed int (*compfn)int (compfn)
  2. 如果是前者,那么不應該調用(*compfn)

句法:

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

compfn是由typedef關鍵字定義的新用戶定義type

所以,你有正確的typedefded int (*)(const void*, const void*); 使用我上面描述的語法來comfn

聲明:

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

表示fun是一個函數指針,它接受const void* types的兩個參數並返回int

假設你有一個像這樣的函數:

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

那么你可以將xyz地址分配給fun

fun = &xyz; 

在調用qsort()

在表達式(compfn)compare一個函數compare (compfn)類型函數。

一個疑問:

不應該呼叫(*compfn)

不,它的類型名稱不是函數名稱。

注意 :如果你只是寫int (*compfn) (const void*, const void*); 如果沒有typedef,那么comfn將是一個指向函數的指針,該函數返回int並獲取兩個類型為const void*參數const void*

typedef聲明為特定類型創建別名 這意味着它可以在聲明和定義中用作任何其他類型。

所以如果你有例如

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

然后,您可以僅使用compfn而不是整個函數指針聲明來聲明變量或參數。 例如,這兩個聲明是相同的:

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

兩者都創建了一個函數指針變量,唯一的區別是變量名的名稱。

當你有長而復雜的聲明時,使用typedef是很常見的,這樣既可以輕松編寫這樣的聲明,也可以使它更容易閱讀。

它是一種函數指針。 被指向的函數返回int並接受兩個const void*參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM