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

StackOverflow https://stackoverflow.com/questions/816356

  •  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 (*)());
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top