void (*)(int, char *, int)
является анонимным параметр типа «указатель на функцию, возвращающую void
и принимает три аргумента: int
, а char *
и другой int
». Вам необходимо передать имя такой функции (в вашем случае, bar
) в качестве второго аргумента функции foo
. Лично я бы предпочел видеть объявление foo
, написанное с типом возврата и именами параметров, а объявление bar()
также должно иметь тип возврата и имена параметров. Имена не должны совпадать между объявлением функции и определением, но обычно это не считается хорошим стилем для изменения имен между ними.
void foo(int num, void (*func)(int num, char *str, int len));
static void bar(int num, char *str, int len);
Вы можете позвонить:
foo(10, bar);
Внутри foo()
, вы будете иметь код, такой как:
void foo(int num, void (*func)(int num, char *str, int len))
{
char str[] = "Supercalifragilisticexpialidocious";
(*func)(num, str, strlen(str));
}
Или, если вы новичок в школу (не архаический пережиток, как я), то:
void foo(int num, void (*func)(int num, char *str, int len))
{
char str[] = "Supercalifragilisticexpialidocious";
func(num, str, strlen(str));
}
Они эквивалентны. Я по-прежнему предпочитаю, чтобы явная функция «Я вызываю функцию через указатель на функцию», но это необязательно, и современный стиль обычно избегает ее.
Что вы пытаетесь достичь (особенно в отношении вашего комментария к ответу Оуа)? – mafso