什么是C的工人?

时间:2013-03-16 01:00:22

标签: c function function-pointers worker

我正在查看ss命令代码,我看到一个似乎将函数作为参数传递给另一个函数的函数。但我认为这样做的方法是声明一个函数的指针。在代码中,他们执行如下操作:

generic_record_read(fp, tcp_show_line, f, AF_INET6).

该功能的原型是:

static int generic_record_read(FILE *fp,
               int (*worker)(char*, const struct filter *, int),
               const struct filter *f, int fam);

我认为作为参数传递给generic_record_read的函数是tcp_show_line,原型是:

static int tcp_show_line(char *line, const struct filter *f, int family)

我不明白将tcp_show_line中的参数generic_record_read声明为int (*worker)(char*, const struct filter *, int)

的方式

类型(char*, const struct filter *, int)与tcp_show_line的参数对应,但前面有int (*worker)

似乎所有这都是将函数作为参数传递的一种方式,因为在generic_record_read的实现中, working 被用作函数tcp_show_line,但我从未见过这样的事情:

static int generic_record_read(FILE *fp,
               int (*worker)(char*, const struct filter *, int),
               const struct filter *f, int fam)
{
//....

    if (worker(line, f, fam) < 0)
        return 0;
//.....
}

我错了吗?

2 个答案:

答案 0 :(得分:1)

int (*worker)(char*, const struct filter *, int)

表示worker是一个指向函数的指针,该函数接受参数列表(char *, const struct filter *, int)并返回int。那是你的问题吗?

答案 1 :(得分:1)

正如您所料, worker 是一个函数指针,在调用时,它采用以下参数:char*, const struct filter *, int。如果您以前没有看到任何此类内容,那么您显然没有使用qsortbsearch,它们是用于排序和搜索的标准C函数。这种抽象在C中非常有用。