2

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

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

4

3 回答 3

2

这是一个可以帮助您的代码片段:

#include <stdio.h>

typedef int (*func)(const char* format, ...);

int main()
{
    func a = printf;
    a("Hello World\n");
    return 0;
}

现在,如果你想在 C 语言中创建自己的函数,它接受可变数量的参数,GNU 手册中的这个页面是一个很好的资源,可以用来解释可变参数函数的工作原理。

于 2013-01-07T20:35:06.513 回答
1

创建您自己的函数类型,将您的列表元素作为参数。如果唯一匹配的函数是 ,则创建以函数为参数的遍历过程是没有意义的printf。(printf 有非常独特的签名)

于 2013-01-07T20:42:04.277 回答
0

您应该将 printf 转换为函数的参数类型:

traverse_list(my_list, (int (*) (void*))&printf);

请记住在使用它之前将其转换回来,否则这将导致未定义的行为。

(我假设您不想在这里更改函数的参数。)

编辑:

如果你真正要问的是你的函数应该采用什么参数,那么它应该是一个指向对应于 printf 概要的函数的指针,你可以在以下位置找到它man 3 printf

int printf(const char *format, ...);
于 2013-01-07T20:36:37.093 回答