2015-05-27 149 views
-1

我有一個函數指針的問題。我有這個typedef:如何正確使用函數指針

typedef struct patchwork *(*create_patchwork_value_fct) 
              (const enum nature_primitif); 

它是通用的(在另一個文件中實現)。我想用輸入來調用它。我該怎麼做 ?

+0

這個函數指針typedef的工作方式與您執行'typedef int * obscure_t; ... obscure_t ptr =&some_int;' – Lundin

回答

1

您需要

  1. 定義typedef版函數指針的類型的變量。
  2. 將具有相同簽名的函數的地址添加到它。
  3. 使用該變量作爲正常函數名稱進行函數調用。

僞代碼

如果你有一個像

struct patchwork * funccall(const enum nature_primitif) 
{ 
    //do something 
} 

,然後一個功能,你可以做

create_patchwork_value_fct fp= funccall; 
struct patchwork * retptr = NULL; 
enum nature_primitif enumVal = <some enum value>; 

retptr = fp(enumVal); 

也許你可以閱讀this answer得到一些更深入的瞭解。

+1

我錯過了什麼嗎?不是create_patchwork_value_fct typedef,而不是func ptr本身? – mjs

+1

後來三次編輯,他說得對;-) –

+0

@mjs我錯了,糾正了。 :-) –

0

這心不是實際上是一個函數指針 - 這是定義一個函數指針類型:

typedef struct patchwork *(*create_patchwork_value_fct) (const enum nature_primitif);

所以,這定義了一個名爲create_patchwork_value_fct函數指針類型。這是一個指向一個函數的函數指針,它接受一個參數(const enum nature_primitif),並返回一個struct patchwork* - 即指向拼湊結構的指針。

讓我們看看這到底是怎麼使用:

void someFunc(create_patchwork_value_fct funcToCall, enum param) 
{ 
    funcToCall(param); 
} 

struct patchwork* CreateAPatchworkValue(enum nature_primitif enumVal) 
{ 
    struct patchwork* pwork = malloc(sizeof(struct patchwork)); 
    pwork->someVal = enumVal; 
    return pwork; 
} 


void main() 
{ 
    someFunc(CreateAPatchworkValue, <a valid nature_primitif enumeration value>) 
} 

在這個例子中,main()電話someFunc(),指針傳遞到CreateAPatchworkValue爲funcToCall參數,並從nature_primitif枚舉值。

someFunc然後調用funcToCall,它實際上是對CreateAPatchworkValue的調用。