我正在用c语言开发一个线程池,我想让一个任务有一个任意数量的参数。甚至以为我可以使用像
这样的功能int (*task) ();
可以使用任何类型的参数调用此函数,例如我可以执行
int fib(int n) { return n < 2 ? n : fib(n-1) + fib(n-2); }
...
task = fib;
printf("fib(10)=%d\n",task(10));
但是我想要的是能够保存参数以便以后运行它,而不必使用对malloc的调用,因为否则我宁愿只使用像
这样的任务void * (*task) (void *);
其中我只需要在struct上保存void *参数。 但是我想为任意参数做到这一点,是否有可能自动为我想要的任何类型的函数,甚至不使用任何va_list。
有可能吗?
提前
答案 0 :(得分:1)
我害怕你想要的东西是不可能的 - 因为我正确理解了你的问题。
我实现它的方法是使用一个指向struct
的匿名指针,该实现由回调和调用者知道,但不是线程池,它只携带一个指针。
但遗憾的是,该解决方案意味着在预先分配的空间上使用malloc()
或讨厌的内存副本,该空间可能位于堆栈上或全局上。
答案 1 :(得分:1)
如果它只是参数,那么我会使用:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wstrict-prototypes"
typedef void *(*task_t)();
#pragma GCC diagnostic pop
但这对返回类型不起作用。
第一个#pragma
使GCC记住在命令行上提供了哪些-W
标志。当前警告标志被推入堆栈。
第二个#pragma
让GCC不再抱怨没有参数。
第3个#pragma
恢复旧警告。
'#pragma'指令是C标准指定的方法,用于向编译器提供附加信息,超出语言本身传达的内容。