2015-05-27 115 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的调用。