Я не могу найти в стандарте что-либо, связанное с указателями обобщенных функций, в C FAQ ( Вопрос 1.22 ), которое они используют:
typedef int (*funcptr)(); /* generic function pointer */
typedef funcptr (*ptrfuncptr)(); /* ptr to fcn returning g.f.p. */
Немного поиграю с конечными автоматами, это мой подход:
#include <stdio.h>
#define STM(x) (stm)x
typedef void (*stm)(void);
typedef stm (*pstm)(void *);
stm start(void *),
state1(void *),
state2(void *),
state3(void *),
stop(void *);
static int exit_state(int state)
{
char str[2];
int c;
printf("Exit state %d? ", state);
if (fgets(str, sizeof str, stdin)) {
while (((c = fgetc(stdin)) != '\n') && (c != EOF));
return (str[0] == 'y') || (str[0] == 'Y');
}
return 0;
}
static void state_machine(pstm pstart, void *data)
{
pstm state = pstart;
while (state != NULL) {
state = (pstm)(*state)(data);
}
}
stm start(void *data)
{
puts("Starting state machine");
*(char **)data = "Comes from start";
return STM(state1);
}
stm state1(void *data)
{
puts(*(char **)data);
puts("State 1");
if (!exit_state(1)) {
return STM(state1);
}
*(char **)data = "Comes from state 1";
return STM(state2);
}
stm state2(void *data)
{
puts(*(char **)data);
puts("State 2");
if (!exit_state(2)) {
return STM(state2);
}
*(char **)data = "Comes from state 2";
return STM(state3);
}
stm state3(void *data)
{
puts(*(char **)data);
puts("State 3");
if (!exit_state(3)) {
return STM(state1);
}
return STM(stop);
}
stm stop(void *data)
{
(void)data;
puts("Stopping state machine");
return NULL;
}
int main(void)
{
char *data;
state_machine(start, &data);
return 0;
}
Мой вопрос: это действительно для использования
typedef void (*stm)(void);
как общий указатель на функцию?
Из того, что я вижу, видно, что мы можем использовать любой тип прототипа перед выполнением приведения, то есть
typedef long double (*stm)(unsigned long long);
также действителен
мои предположения верны?