我正在处理一个链表库,这是我写的一个函数:
/**
* go through a linked list and perform function func for every node of the
* linked list
*
* func is a function pointer to the function you would to apply on the node.
* it should return 0 if it is successful and non-zero value otherwise.
*/
void traverse_list(linkedlist * ll, int (* func)(void * args)){
node * temp;
temp = ll->head;
while( temp != NULL ){
if((* func)(temp->val))
fprintf(stderr,"Error processing value!\n");
temp = temp->next;
}
}
我的问题很简单,我尝试了类似travers_list(testlinkedlist,printf)
的东西,但它无法正常工作(printf没有打印出任何东西),我做错了什么?如果可以的话,我可以这样做吗?
答案 0 :(得分:2)
以下是帮助您解决问题的代码段:
#include <stdio.h>
typedef int (*func)(const char* format, ...);
int main()
{
func a = printf;
a("Hello World\n");
return 0;
}
现在,如果你想创建自己的函数,在C中使用可变数量的参数,this page from the GNU manual是一个很好的资源,可以解释可变函数的工作原理。
答案 1 :(得分:1)
创建自己的函数类型,将list元素作为参数。
如果唯一匹配的函数是printf
,那么创建遍历过程并将函数作为参数是没有意义的。 (printf有很独特的签名)
答案 2 :(得分:0)
您应该将printf强制转换为函数的参数类型:
traverse_list(my_list, (int (*) (void*))&printf);
请记住在使用它之前将其强制转换,否则这将导致未定义的行为。
(我假设你不想在这里改变你的功能参数。)
编辑:
如果你真正问的是你的函数应该采用什么参数,那么它应该是一个指向函数的指针,对应于printf的概要,你可以在man 3 printf
找到:
int printf(const char *format, ...);