gpt4 book ai didi

c - 如何将varargs添加到c中的结构

转载 作者:行者123 更新时间:2023-12-02 01:00:05 26 4
gpt4 key购买 nike

我有一个接受可变参数的 c 函数。我想将这个函数的所有参数(连同可变参数)存储在一个结构中,并将该结构传递给另一个函数,该函数将解析所有结构中的元素。但是我不知道如何将获得的变量参数添加到结构中。

void fun1(char* c,int i,...)
{
//I want to create a structure
//of all the input params.
//But how to add the varargs?
//Which type am I suppose to declare in structure?

}

有人能告诉我该怎么做吗?任何帮助或想法都会非常有帮助!!

最佳答案

要访问可变参数,您需要使用函数/宏的 stdarg 系列:

void fun1(char* c,int i,...)
{
va_list args;
va_start(args, i);
// do something with args
va_end(args);
// args is no longer usable
}

虽然您可以将 args 传递给另一个函数,但在另一个线程中使用它时需要小心。一旦调用 va_end 并且 fun1 退出,args 将不再可用。使用 va_copy 也不起作用,因为您仍然需要在新对象上调用 va_end int 相同的函数

如果您要对参数执行复杂的操作,您需要先在当前线程中解析它们,然后将解析后的参数提供给另一个线程。

例如:

enum paramtype {
TYPE_INT,
TYPE_DOUBLE,
TYPE_STRING
};

struct param {
enum paramtype type;
union {
int i;
double d;
char *s;
} data;
};

void fun1(char* c,int i,...)
{
int x;
va_list args;

struct param *params = malloc(sizeof(*params) * i);

va_start(args, i);
for (x=0; x<i; x++) {
params[i].type = c[i];
switch (params[i].type) {
case TYPE_INT:
params[i].data.i = va_arg(args, int);
break;
case TYPE_DOUBLE:
params[i].data.d = va_arg(args, double);
break;
case TYPE_STRING:
params[i].data.s = strdup(va_arg(args, char *));
break;
}
}
va_end(args);

handle_args_in_other_thread(params, i);
}

关于c - 如何将varargs添加到c中的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51249595/

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