我有两个前向声明的函数和一个结构:
int _bar(void*);
int _bar2(int);
typedef struct foo {
void* array[128];
int (*bar)(void* x) = _bar;
int (*bar2)(int x) = _bar2;
} FOO;
如何在array
的任意实例中从bar
和bar2
访问FOO
,以使array
对每个函数都是可变的? 可以做到吗?
是的,我知道只使用C以外的东西来做这种事情会更容易,而且可以说是更好。这根本不是重点,所以请回答所要求的问题,而没有像这里的许多回复那样试图“诊断”更深层的问题。
答案 0 :(得分:4)
您正在尝试在C
中进行OOP。您希望bar
和foo
像C ++成员函数。您无法在C
中这样做,甚至不应该尝试。不要与语言作斗争。
只需在自由函数中添加一个Foo
参数:
typedef struct foo {
void* array[128];
} Foo;
int bar(/*const*/ Foo* foo, void*);
int bar2(/*const*/ Foo* foo, int);
答案 1 :(得分:1)
您可以执行以下操作:
#include <stdio.h>
typedef struct foo {
int array[128];
int(*bar)(struct foo* this, void* x);
int(*bar2)(struct foo* this, int x);
} FOO;
int _bar(FOO *this, void *p)
{
printf("bar2(%p)\n", p);
return 0;
}
int _bar2(FOO *this, int i)
{
printf("array[4] = %d\n", this->array[4]);
printf("bar2(%d)\n", i);
return i*2;
}
void ConstructFoo(struct foo *f)
{
for (int i = 0; i < sizeof(f->array) / sizeof(f->array[0]); i++)
f->array[i] = i;
f->bar = _bar;
f->bar2 = _bar2;
}
int main()
{
struct foo f;
ConstructFoo(&f);
printf ("%d\n", f.bar2(&f, 42));
}
我只是为了简化示例而修改了array
的类型。
可以根据实际需要进一步增强此示例,例如,您可以添加将bar
和bar2
“成员”函数设置为_bar
以外的函数的函数,并且_bar2
。