首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确使用同一操作不同类型的回调

正确使用同一操作不同类型的回调
EN

Stack Overflow用户
提问于 2018-09-07 00:12:51
回答 1查看 40关注 0票数 1

我正在用C语言开发,我需要一个关于回调用法的信息。

假设我在回调的输入中定义了3个不同类型的回调,例如:

代码语言:javascript
复制
typedef void (*CB_1) (const struct paramType_1 *p);
typedef void (*CB_2) (const struct paramType_2 *p);
typedef void (*CB_3) (const struct paramType_3 *p);

我有3个回调数组,每个数组对应的是回调类型:

代码语言:javascript
复制
static CB_1         CB1List[10] ;
static CB_2         CB2List[10] ;
static CB_3         CB3List[10] ;

所以我定义了3个回调列表(可能在不同的情况下),每个列表都是特定类型的回调(CB_1,CB_2或CB_3),它们有一个特定的回调参数(paramType_1,paramType_2或paramType_3)。

假设现在我需要执行一个对每个回调都相同的操作...我必须复制粘贴3次由于不同的具体参数的函数…例如,假设我需要向数组添加一个回调,我需要这样:

代码语言:javascript
复制
   static void CBAdd_1(CB_1 _cb) {   
      CB1List[i] = _cb
    }
   static void CBAdd_2(CB_2 _cb) {   
      CB2List[i] = _cb
    }
    static void CBAdd_3(CB_3 _cb) {  
      CB3List[i] = _cb
    }

使用泛型函数“空CBAdd”不复制三次回调函数的正确方法是什么?也许使用(void*)参数或其他?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-07 01:35:52

是的,您需要一个void*参数,如下所示。或者(取决于您的需要),您可以使用联合而不是结构,并将所有成员存储在单个联合类型中。这样,一个联合类型参数将被传递给所有函数,并且函数定义可以决定使用哪个成员。

代码语言:javascript
复制
#include <stdio.h>

typedef struct paramType_1
{
  int p;
} paramType_1;

typedef struct paramType_2
{
  int p;
} paramType_2;

typedef struct paramType_3
{
  int p;
} paramType_3;

typedef void (*CB) (const void* p);

static CB CBList[10];

void CB_1(const void* p)
{
  const paramType_1* pt = (paramType_1*)p;
  printf("p1: %d\n", pt->p);
}

void CB_2(const void* p)
{
  const paramType_2* pt = (paramType_2*)p;
  printf("p2: %d\n", pt->p);
}

void CB_3(const void *p)
{
  const paramType_3* pt = (paramType_3*)p;
  printf("p3: %d\n", pt->p);
}

static int c = 0;

static void CBAdd(CB cb_)
{
  CBList[c++] = cb_;
}

int main()
{
  int i = 0;
  paramType_1 p1;
  paramType_2 p2;
  paramType_3 p3;

  for (i = 0; i < 3; i++)
  {
    CBAdd(CB_1);
  }

  for (i = 0; i < 3; i++)
  {
    CBAdd(CB_2);
  }

  for (i = 0; i < 3; i++)
  {
    CBAdd(CB_3);
  }

  p1.p = 1;
  p2.p = 2;
  p3.p = 3;

  for (i = 0; i < 3; i++)
  {
    (CBList[i])((void*)&p1);
  }

  for (i = 3; i < 6; i++)
  {
    (CBList[i])((void*)&p2);
  }

  for (i = 6; i < 9; i++)
  {
    (CBList[i])((void*)&p3);
  }

  return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52208303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档