【问题标题】:How to use a function pointer properly如何正确使用函数指针
【发布时间】:2015-05-27 09:06:51
【问题描述】:

我的函数指针有问题。我有这个类型定义:

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

这是通用的(在另一个文件中实现)。我想用输入来调用它。我该怎么办?

【问题讨论】:

  • 这个函数指针 typedef 的工作方式和你做的一样typedef int* obscure_t; ...obscure_t ptr = &some_int;

标签: c function-pointers typedef


【解决方案1】:

你需要

  1. 定义typedefed 函数指针的类型变量。
  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 以获得更多见解。

【讨论】:

  • 我错过了什么吗? create_patchwork_value_fct 不是 typedef,不是 func ptr 本身吗?
  • @DaanTimmer 是的,我的立场是正确的。不过,感谢 mjs。 :-)
【解决方案2】:

这实际上不是一个函数指针——这是定义一个函数指针类型:

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 的调用。

【讨论】:

    猜你喜欢
    • 2019-11-10
    • 1970-01-01
    • 2012-02-20
    • 2018-03-01
    • 2018-08-26
    • 2016-09-06
    • 2021-12-29
    • 1970-01-01
    • 2022-11-21
    相关资源
    最近更新 更多