在C语言中,如何将结构的数据成员用作同一结构的成员所指向的函数的一部分?

时间:2018-10-04 06:12:49

标签: c struct function-pointers

我有两个前向声明的函数和一个结构:

int _bar(void*);
int _bar2(int);

typedef struct foo {
  void* array[128];
  int (*bar)(void* x) = _bar;
  int (*bar2)(int x) = _bar2;
} FOO;

如何在array的任意实例中从barbar2访问FOO,以使array对每个函数都是可变的? 可以做到吗?

是的,我知道只使用C以外的东西来做这种事情会更容易,而且可以说是更好。这根本不是重点,所以回答所要求的问题,而没有像这里的许多回复那样试图“诊断”更深层的问题。

2 个答案:

答案 0 :(得分:4)

您正在尝试在C中进行OOP。您希望barfoo像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的类型。

可以根据实际需要进一步增强此示例,例如,您可以添加将barbar2“成员”函数设置为_bar以外的函数的函数,并且_bar2