0

我正在查看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_readis tcp_show_line,原型是:

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

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

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

似乎这是一种将函数作为参数传递的方式,因为在 的实现中generic_record_read工作就像是函数一样使用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;
//.....
}

我错了吗?

4

2 回答 2

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

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

于 2013-03-16T01:04:22.893 回答
1

正如您所料,worker是一个函数指针,当被调用时,它接受以下参数:char*, const struct filter *, int. 如果您以前没有见过这些,那么您显然没有使用过qsortbsearch,它们是用于排序和搜索的标准 C 函数。这种抽象在 C 语言中非常有用。

于 2013-03-16T01:08:14.513 回答