вызовите другую дочернюю функцию из одной родительской функции - PullRequest
0 голосов
/ 29 мая 2009

Мне нужна общая родительская функция, вот так

void main (param 1, param 2)
{
    <stuff to do>
    param1();
    print("The function %s was called", param 2);
    <more stuff to do>
}

Где param 1 будет именем вызываемой функции, а param 2 будет некоторым описательным текстом. Параметр 2 прост, и я это решил, но мне неясно, как бы я вызывал функцию из той же родительской функции, передавая имя функции. Есть несколько других вещей, которые делает родительская функция, но вместо того, чтобы иметь несколько родительских функций, которые отличаются только функцией, которую они вызывают, или одного родителя с оператором switch, id предпочитает, если этот способ возможен. Есть мысли?

Ответы [ 5 ]

5 голосов
/ 29 мая 2009

То, что вы на самом деле хотите передать для параметра 1, это указатель на функцию, которую вы хотите вызвать, в отличие от имени этой функции.

Взгляните на этот учебник о указателях функций.

0 голосов
/ 30 мая 2009

Как то так?

#include <stdio.h>
void foo(void) { printf("foo\n"); }
void bar(void) { printf("bar\n"); }
static inline void parent(void func(), const char *msg)
{
    /* do stuff */
    func();
    printf("%s called\n", msg);
    /* more stuff */
}
int main(void)
{
    parent(foo, "test1");
    parent(bar, "test2");
    return 0;
}
0 голосов
/ 29 мая 2009

Я бы сказал, что указатели на функции - это хорошо, но вы можете использовать препроцессор, чтобы делать то, что вы хотите ... (хотя научиться использовать указатели на функции - это хорошо) ...

Я имею в виду, что если param2 является чем-то статически известным, иметь указатели на функции довольно бесполезно. Указатели на функции были бы лучше, если у вас есть динамические значения и при запуске вашей программы, когда вы хотите задать param2 = foo param2 = bar ...

Вам действительно нужны разные прототипы функций, или у вас может быть что-то вроде ...

#ifdef BAR
 void foo() { whatever(); }
#elif defined(FOO)
 void foo() { whocares(); }
#else
 #define foo() do{} while(0)
#endif

и всегда имеют одно и то же тело, но в командной строке вводится разное -D ...

0 голосов
/ 29 мая 2009

Это не так просто сделать на C и скомпилированных языках в целом. На Windows у меня что-то вроде этого (это было давно):

typedef void(* simple_void_function )()
HMODULE exe_module = GetModuleHandle( NULL ); // not sure about this
simple_void_function = GetProcAddress( exe_module, param1 );
(*simple_void_function)();

Фактическая сигнатура вызова функции может быть более гибкой, если вы хотите вручную помещать аргументы в стек.

0 голосов
/ 29 мая 2009

Какой это язык? если функции не являются гражданами первого класса на этом языке, вы не можете сделать это

Если это что-то вроде Java, вы можете обойти это, передав объект, который реализует интерфейс, и просто вызвать эту функцию на объекте.

...