Весь код написан на ANSI C, и так и должно быть.
У меня есть обратный вызов, определенный так:
typedef enum {
Event_One,
Event_Two,
Event_State
} EventEnum;
typedef void (*callback)(EventEnum event, void* data);
Получатель обратного вызова интерпретирует data
в зависимости от значения event
. Это контракт между компонентами. Иногда это указатель на структуру, иногда это может быть строка, в других случаях это могут быть другие данные. Я определяю дополнительный event
и устанавливаю новый "контракт", который data
является перечислением. Вот так:
typedef enum {
State_Initial = 0,
State_Running,
State_Final
} StateEnum;
Тогда где-то в коде у меня есть функция обратного вызова, которая делает это
void ProcessEvent (EventEnum event, void* data)
{
if (event == Event_State)
{
StateEnum state = (StateEnum)data; /* <<<<<<<<<<< */
switch (state) {
case State_Initial:
<...>
break;
case State_Running:
<...>
break;
case State_Final:
<...>
break;
}
}
}
Обратный вызов выше называется так:
{
callback infoCallback = ProcessEvent; /* This is only for example,
done during initialization */
<...>
StateEnum someState = State_Running;
<...>
infoCallback(Event_State, (void*)someState); /* <<<<<<<<<<<<<<<<<<< */
}
Что-то в корне неверно с типизацией void*
до StateEnum
и наоборот? Каковы возможные ошибки на этом пути? Есть мысли по поводу тестируемости и ремонтопригодности?
РЕДАКТИРОВАТЬ: Код компилируется, ссылки и работает нормально сейчас. Я хочу знать, почему этого не следует делать и есть ли реальные причины, по которым код должен быть изменен.