"Сделать сложно - просто, сделать просто - сложно" (c) G.W.
Внимание! Пост проплачен здравым смыслом
Я перекопал достаточное количество чужого кода и думал что видел если не всё, то многое :)
Сегодня был приятно удивлен, что есть люди, которые внимательно следят за обновлениями стандарта С99. Итак, встречаем кусок С-шного файла:
call_mngr_cbs_t call_mngr_cbs = { play_signal: play_signal_cb, start_signal: start_signal_cb, stop_signal: stop_signal_cb, update_display: display_update_cb, dialstring_is_complete: dialstring_is_complete_cb, dialstring_to_addr: dialstring_to_addr_map_cb, prepare_connection: line_connection_prepare_cb, create_connection: line_connection_create_cb, start_connection: line_connection_start_cb, stop_connection: line_connection_stop_cb, modify_connection: line_connection_modify_cb, destroy_connection: line_connection_destroy_cb, set_endpoint_context: line_connection_context_create, free_endpoint_context: line_connection_context_destruct, is_state: is_state_cb, enum_codecs: enum_codecs_cb };
Пишу я в основном на С++ (дзен-буддизм Си приходит ко мне не всегда), пришлось подумать секунд 10 что это за хрень :): мозг прошел через все шаги типа "Ой - Фигасе - Ну и нафиг это".
Для тех, кому лень включать мозг - ответ: инициализатор структур в С, в данном случае инициализирует члены структуры указателями на функции. Таких приспособлений в коде пачка, разобраться что и откуда вызывается - проблематично. Не пишите такой код, иначе вас настигнет кара - я гарантирую это :).
ИМХО, после того как все фичи Фортрана заклёпками приштопают к С, сам язык можно будет спокойно положить на полку и заменить на С++.
Для тех, кому лень включать мозг - ответ: инициализатор структур в С, в данном случае инициализирует члены структуры указателями на функции. Таких приспособлений в коде пачка, разобраться что и откуда вызывается - проблематично. Не пишите такой код, иначе вас настигнет кара - я гарантирую это :).
ИМХО, после того как все фичи Фортрана заклёпками приштопают к С, сам язык можно будет спокойно положить на полку и заменить на С++.
Это коллбэки. С ними так всегда -- разобраться невозможно. А нужно ли?
ОтветитьУдалитьЕсли б они работали нормально, то я б в жизни туда не полез...
ОтветитьУдалитьА от любителі поковбасити на ДжаваСкріпті, не лише легко розпізнають цей синтаксичний перл, але й обома руками проголосують за додавання лямбда функцій в наступний стандарт ;)))
ОтветитьУдалитьДо речі, ця форма набагато ліпше за варіант без двоєточій, де буде щось типу {play_signal_cb,start_signal_cb,...} і доведеться вписувати коментарі ручками.
"Не пишите такой код" - а який тоді написати взамін? ;)
Ну питання тут не конкретно про ініціалізацію структури чи її стиль (двокрапки і т.п.). Проблема саме в відслідковуванні викликів цих колбеків, оскільки вказівники динамічно підміняються :)
ОтветитьУдалить