Como posso typedef um ponteiro de função que leva uma função de seu próprio tipo como um argumento?
-
03-07-2019 - |
Pergunta
Exemplo:. Uma função que leva uma função (que leva uma função (que ...) e um int) e um int
typedef void(*Func)(void (*)(void (*)(...), int), int);
Ela explode de forma recursiva, onde (...)
. Existe uma razão fundamental isto não pode ser feito ou existe outra sintaxe? Parece-me que deve ser possível sem um elenco. Estou realmente tentando passar um despacho-mesa, mas eu poderia descobrir isso se eu pudesse passar este um tipo.
Solução
Você pode envolver o ponteiro de função em um struct:
struct fnptr_struct;
typedef void (*fnptr)(struct fnptr_struct *);
struct fnptr_struct {
fnptr fp;
};
Eu não tenho certeza se isso é uma melhoria em qualidade. Eu suspeito que é impossível sem a struct porque C requer tipos a serem definidas antes de serem usados ??e não há nenhuma sintaxe opaco para typedef.
Outras dicas
É impossível fazer diretamente. Suas únicas opções são para fazer o argumento de ponteiro de função aceitar os argumentos não especificados, ou para aceitar um ponteiro para uma estrutura que contém o ponteiro de função, como Dave sugeriu .
// 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 (*)());