1

次のコードで示すように、関数ポインターの配列を定義することは可能ですか(関数には同じ入力引数がありません)?

はいの場合、関数定義に何を入力する必要がありますかint (*handler)(/*what Ihave to put here ?*/);

struct handler_index {
    const char *name;
    int (*handler)(/*what Ihave to put here ?*/);
};

int handler0 (int a, int b)
{
    printf("%d\n",a+b);
}

int handler1 (int a, int b, int c)
{
    printf("%d\n",a+b+c);
}

int handler2 (int a, int b, int c, int d)
{
    printf("%d\n",a+b+c+d);
}

const struct handler_index handler_index[] = {
  [0] = {"handler0", handler0},
  [1] = {"handler1", handler1},
  [2] = {"handler2", handler3},
};
4

3 に答える 3

5

何も入れないでください:

int (*handler)();

これは、関数に未指定の(ただし可変ではない)パラメーターの数とタイプがあることを意味します。

とを返す任意の関数をint、固定の可変数のパラメーターでに割り当てることができますhandler

于 2012-12-26T17:29:04.057 に答える
3

確かint (*handler)() に th 関数の可変数の引数を許可しますが、これには何の利点もありません。関数ポインターは、何かを受け取り、「正しいこと」を見つけ (たとえば、「名前」を他の場所からの入力と比較する)、関数ポインターを呼び出して必要なことを行うコードがある場合に役立ちます。コードを呼び出す関数ポインターは、関数が持つ引数の数を知る必要があります (それ以外の場合、正しい数と引数の順序を渡すにはどうすればよいでしょうか。

私は実際にこれの意味のある使用をまったく見ません。はい、可変数の引数を関数に渡すことができますが、コードは関数が受け取る引数を認識している必要があります。

引数が構造体の定義で何らかの形で指定されていない限り - ただし、それを可能にするために、構造体に別のコンテンツを定義する必要があります。

何を達成しようとしているのかを考えてから、おそらく別の方法を使用して問題の解決策を考え出す必要があることをお勧めします。

于 2012-12-26T18:47:15.413 に答える
0

何も入れない。角かっこを空にします。

int (*handler)();
于 2012-12-26T17:29:40.560 に答える