среда, 20 января 2010 г.

Программерское чтиво

"Сделать сложно - просто, сделать просто - сложно" (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 что это за хрень :): мозг прошел через все шаги типа "Ой - Фигасе - Ну и нафиг это".

Для тех, кому лень включать мозг - ответ: инициализатор структур в С, в данном случае инициализирует члены структуры указателями на функции. Таких приспособлений в коде пачка, разобраться что и откуда вызывается - проблематично. Не пишите такой код, иначе вас настигнет кара - я гарантирую это :).
ИМХО, после того как все фичи Фортрана заклёпками приштопают к С, сам язык можно будет спокойно положить на полку и заменить на С++.

4 комментария:

  1. Это коллбэки. С ними так всегда -- разобраться невозможно. А нужно ли?

    ОтветитьУдалить
  2. Если б они работали нормально, то я б в жизни туда не полез...

    ОтветитьУдалить
  3. А от любителі поковбасити на ДжаваСкріпті, не лише легко розпізнають цей синтаксичний перл, але й обома руками проголосують за додавання лямбда функцій в наступний стандарт ;)))

    До речі, ця форма набагато ліпше за варіант без двоєточій, де буде щось типу {play_signal_cb,start_signal_cb,...} і доведеться вписувати коментарі ручками.

    "Не пишите такой код" - а який тоді написати взамін? ;)

    ОтветитьУдалить
  4. Ну питання тут не конкретно про ініціалізацію структури чи її стиль (двокрапки і т.п.). Проблема саме в відслідковуванні викликів цих колбеків, оскільки вказівники динамічно підміняються :)

    ОтветитьУдалить