是否可以将printf作为参数转换为另一个函数?

时间:2013-01-07 20:29:08

标签: c pointers linked-list function-pointers

我正在处理一个链表库,这是我写的一个函数:

/**
 * 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没有打印出任何东西),我做错了什么?如果可以的话,我可以这样做吗?

3 个答案:

答案 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, ...);