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;
}
我想创建一个任务结构,其中包含一个指向回调的函数指针以执行所述任务。该任务包含参数,因此我想将结构的 "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;
}