将函数分配给函数指针

Assigning function to function pointers

我写了一个测试程序来理解回调函数和函数pointers.The程序如下。

我的问题是在分配

cb_display = (void*)display_struct;

我必须将函数转换为 void*。为什么即使 return 类型的函数为 void 也需要这样做?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    int a;
    char b[16];
}myst_t;

void (*cb_display)(void*);

void display_struct(myst_t *st){
    fprintf(stdout, "a -> %d b -> %s \n",st->a,st->b);    
}

int main()
{
    myst_t myst;
    myst.a = 789432;
    strncpy(myst.b,"helloabcd",9);

    cb_display = (void*)display_struct;

    cb_display(&myst);

    return 0;
}
cb_display = (void*)display_struct;

实际上在 C 中也是无效的。不要这样做。您不能将 void * 分配给函数指针。

要解决您的问题,请将您的函数指针声明为:

void (*cb_display)();

表示它匹配一个return无值且参数数量不详的函数。然后你不需要任何演员。另请注意,正如 Olaf 在评论中指出的那样,具有 () 的函数声明符在有效时是一个过时的 C 功能。

当然如果你只传递像display_struct这样的函数带有myst_t *参数,你也可以将cb_display声明为:void (*cb_display)(myst_t *);

更改无效 (cb_display)(无效);

typedef void (cb_display)(void);

可能有用。