C 函数指针回调作为具有 "self" 引用参数的结构成员

C function pointer callback as struct member with "self" reference parameter


我想创建一个任务结构,其中包含一个指向回调的函数指针以执行所述任务。该任务包含参数,因此我想将结构的 "this/self" 指针传递给回调执行程序函数。 这会产生循环依赖,我一直在努力尝试各种前向声明等,但似乎无法做到正确。我是不是遗漏了什么使这不可能的事情,或者只是我的 C 语法魔法非常薄弱。把 task* 改成 void* 好像作弊?

在 task.h 中:

// create a function pointer type signature for executing a task
typedef int (*executor) (task* self);

// create a task type
typedef struct {
    executor exec;  // the callback to execute the task
    ... // various data for the task
} task;

转发声明struct task,然后使用struct task声明函数指针,然后声明struct task和typedef task.

struct task;
typedef int (*executor) (struct task* self);

typedef struct task {
    executor exec;  // the callback to execute the task
    ... // various data for the task
} task;

或者如 Jens 所建议的那样:

首先 typedef task 前向声明 struct task,然后声明函数指针(使用 typedef task)和 struct task.

typedef struct task task;
typedef int (*executor) (task* self);

struct task {
    executor exec;  // the callback to execute the task
    ... // various data for the task
};

你必须在前面添加一个不完整的类型声明,告诉编译器该类型稍后定义。您可以 "abuse" 事实上,所谓的结构标签有自己的名称空间,与类型名称分开所以结构标签名称可以与类型名称相同:

typedef struct task task; // typedef a struct task as "task"
typedef int (*executor) (task* self); // pointer to incomplete type

typedef struct task { // re-use struct tag name here to complete the type
    executor exec;
} task; // typedef a name for the completed type

...
task t;

Typedef 和 forward 首先声明结构,它应该可以工作,就像那样:

#include <stdio.h>

typedef struct task task;
typedef int (*executor) (task* self);

struct task {
    executor exectr;
    int a;
};

int exec(task* self) {
    return self->a;
}

int main(int, char**) {
    task a = { .exectr = exec, .a=10};
    printf("%d\n",a.exectr(&a));
    return 0;
}