Variadic函数和任意参数保存以供将来执行

时间:2014-02-25 21:00:12

标签: c asynchronous variadic-functions

我正在用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。

有可能吗?

提前

2 个答案:

答案 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标准指定的方法,用于向编译器提供附加信息,超出语言本身传达的内容。

     

- https://gcc.gnu.org/onlinedocs/cpp/Pragmas.html