Как я могу определить указатель на функцию, которая принимает функцию собственного типа в качестве аргумента? - PullRequest
10 голосов
/ 03 мая 2009

Пример: функция, которая принимает функцию (которая принимает функцию (that ...) и int) и int.

typedef void(*Func)(void (*)(void (*)(...), int), int);

Взрывается рекурсивно, где (...). Есть ли фундаментальная причина, по которой это невозможно, или есть другой синтаксис? Мне кажется, это возможно без актерского состава. Я действительно пытаюсь передать таблицу диспетчеризации, но я мог бы понять это, если бы мог просто передать этот тип.

Ответы [ 2 ]

10 голосов
/ 03 мая 2009

Вы можете обернуть указатель функции в структуру:

struct fnptr_struct;
typedef void (*fnptr)(struct fnptr_struct *);
struct fnptr_struct {
  fnptr fp;
};

Я не уверен, что это улучшение на кастинге. Я подозреваю, что это невозможно без структуры, потому что C требует, чтобы типы были определены до их использования, и нет непрозрачного синтаксиса для typedef.

6 голосов
/ 03 мая 2009

Невозможно сделать напрямую. Ваши единственные варианты - заставить аргумент указателя функции принимать неопределенные аргументы или указатель на структуру, содержащую указатель функции, как Дейв предложил .

// Define fnptr as a pointer to a function returning void, and which takes one
// argument of type 'pointer to a function returning void and taking
// an unspecified number of parameters of unspecified types'
typedef void (*fnptr)(void (*)());
...