gpt4 book ai didi

c++ - 将指针传递给 C++ 中的可变参数?

转载 作者:太空宇宙 更新时间:2023-11-04 14:07:57 30 4
gpt4 key购买 nike

我希望通过指向回调函数的指针传递可变数量的参数,该回调函数也由指针引用。有什么方法可以创建可以通过引用传递的参数列表?

例如:

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
}
}

到目前为止,这对一个参数很有效,但是我无法弄清楚如何在结构变量的初始化中传递多个参数的列表。这甚至可以不使用使用 va_list 的构建器函数吗?

最佳答案

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

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

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);
}
}

关于c++ - 将指针传递给 C++ 中的可变参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16180335/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com