1

我希望通过指针将可变数量的参数传递给也被指针引用的回调函数。有什么方法可以创建一个可以通过引用传递的参数列表?

前任:

typedef struct MENUELEMENT
{
  void* OK_func; void* OK_args;
} menuElement_t;

menuElement_t* curMenuElement;

menuElement_t menu[] =
{
  //First Menu Element
  (void*)menuDisplayText, (void*)("Test", (char*)&lcdBuffer[0]) //menuDisplayText is a function that takes two arguments
  //Second Menu Element
  (void*)menuDisplayVal, (void*)&value[0] //menuDisplayVal is a function that takes one argument
};

void loop() //Main Loop - just an example of how the function pointed to by curMenuElement is executed
{
  curMenuElement = &menu[0];
  if(KP_OK)
  {
    (*reinterpret_cast<void (*)(...)>(curMenuElement->OK_func))(curMenuElement->OK_args); //General template for function pointed to at OK_func with OK_args
  }
}

到目前为止,这适用于一个参数,但是我无法弄清楚如何在 struct 变量的初始化中传递多个参数的列表。这甚至可能无需使用使用 va_list 的构建器函数吗?

4

1 回答 1

0

可变参数函数仅接受堆栈上的参数。循环必须知道给定函数的结构中有多少参数值,然后下拉到汇编层以手动将值压入堆栈,然后调用当前函数,最后将值弹出函数退出后的栈。这当然是可行的,但手动完成的工作量很大,而且您会安全地失去编译时间。

您最好将结构本身或至少其成员传递给每个函数,并让他们根据需要决定如何使用这些值。例如:

typedef void (*menuFunc)(void** args, int numArgs);

typedef struct MENUELEMENT
{
    menuFunc OK_func;
    int OK_num_args;
    void** OK_args;
} menuElement_t;

.

void menuDisplayText(void** args, int numArgs)
{
    ...
}

void menuDisplayVal(void** args, int numArgs)
{
    ...
}

void* menuDisplayTextArgs[] =
{
    "Test"
    &lcdBuffer[0]
};

menuElement_t menu[] =
{
  {&menuDisplayText, 2, menuDisplayTextArgs},
  {&menuDisplayVal, 1, &value[0]}
};

.

void loop()
{
    menuElement_t* curMenuElement = &menu[0];
    if (KP_OK)
    {
        curMenuElement->OK_func(curMenuElement->OK_args, curMenuElement->OK_num_args);
    }
}
于 2013-04-23T23:44:17.397 回答