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_readtcp_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の実装では、workedが関数であるかのように使用されるため、これは関数をパラメーターとして渡す方法のようですが、次の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)

Saysは、パラメータリストを受け取り、を返すworker関数へのポインタです。それはあなたの質問でしたか?(char *, const struct filter *, int)int

于 2013-03-16T01:04:22.893 に答える
1

ご想像のとおり、workerは関数ポインタであり、呼び出されると次の引数を取りますchar*, const struct filter *, int。これまでにこれを見たことがない場合は、ソートと検索のための標準のC関数であるqsortまたはbsearchを使用したことがないことは明らかです。この種の抽象化はCで非常に役立ちます。

于 2013-03-16T01:08:14.513 に答える