Как я могу определить указатель на функцию, которая принимает функцию собственного типа в качестве аргумента?
-
03-07-2019 - |
Вопрос
Пример: функция, которая принимает функцию (которая принимает функцию (that ...) и int) и int.
typedef void(*Func)(void (*)(void (*)(...), int), int);
Он взрывается рекурсивно, где (...)
. Есть ли фундаментальная причина, по которой это невозможно, или есть другой синтаксис? Мне кажется, это возможно без актерского состава. Я действительно пытаюсь передать таблицу диспетчеризации, но я мог бы понять это, если бы я мог просто передать этот тип.
Решение
Вы можете обернуть указатель функции в структуру:
struct fnptr_struct;
typedef void (*fnptr)(struct fnptr_struct *);
struct fnptr_struct {
fnptr fp;
};
Я не уверен, что это улучшение на кастинге. Я подозреваю, что это невозможно без структуры, потому что C требует, чтобы типы были определены до их использования, и нет непрозрачного синтаксиса для typedef.
Другие советы
Это невозможно сделать напрямую. Ваши единственные варианты - заставить аргумент указателя функции принимать неопределенные аргументы или принять указатель на структуру, содержащую указатель функции, как Дэйв предложил .
// 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 (*)());