0

これは簡単な質問のはずですが、正しく表現できないか、C 言語の経験がないために C 言語の原則に逆らおうとしている可能性があります。

私がやりたいことは、関数へのポインターを指定して、関数へのポインターを引数として取る別の関数内にラップし、後者のポインターを作成することだけです。コードでの改善:

void do_nothing_1() {}
void do_nothing_2() {}

void wrapper(void(*f)()) { f(); }

int main() {

    // the following will call the function
    // but i just want a pointer of whats being called
    funcion_pointer_1 = wrapper(do_nothing_1);
    funcion_pointer_2 = wrapper(do_nothing_2);

    return 0;
}

質問が意味をなさない場合は、事前にお詫び申し上げます。単に反対票を投じるのではなく、明確にするのを手伝ってください。

編集:要件があいまいであるために望ましい結果を得ることが明らかに困難であることを考えると、私が探しているものについてもう少し具体的に説明します。

構造体内には、関数へのポインターがあります。

struct my_struct {
    int (* run)(void);
}

私がやりたいことは、その関数を変更することです。そのため、ラッパーを使用します。したがって、たとえば、foo が void を返す場合は、それを int に変更します。また、foo を実行する前にいくつかのコードを実行します。

int wrapper(void (*foo)()) {

    // exec some stuff here

    foo();

    return 0;
}

最終的に、構造体から *run ポインターに対応する関数を実行するときに、run() を実行する前に何かを実行し、戻り値の型を変更する必要があります。

4

1 に答える 1

3

正しい構文に苦労している場合は、typedef を使用して物事を明確にすることが役立ちます。コードを書いている自分のためだけでなく、それを維持する必要がある人や、コードが何をしているのかを理解しようとする人のためにも。

別の関数ポインターを引数として取る関数への関数ポインターが必要です。引数、パラメーターなし、戻り値なしの関数から始めます。

typedef void (*void_handler_t)( void);

そして今、関数ポインタパラメータを取り、戻り値を持たないラッパー関数ポインタ:

typedef void (*wrapper_handler_t)( void_handler void_fn);

そしてコード:

void foo( void) {}
void wrapper( void_handler_t wrapped_fn)
{
    wrapped_fn();
}

int main( int argc, char *argv[])
{
    wrapper_handler_t function_pointer;

    function_pointer = &wrapper;
    function_pointer( &foo);

    return 0;
}
于 2012-06-09T05:41:38.447 に答える