Как стать автором
Обновить

Комментарии 10

Хайку еще жива?
С солидным опозданием, но бета должна выйти весной-летом. Ритм у них упал, разработчики по контракту поразбегались, но надежда есть.
Обратный отсчет до вероятной бэты можно наблюдать здесь dev.haiku-os.org/milestone/R1/beta1 (44 открытых тикета осталось, если новые не добавят). А пока лучше ставить последние nightly-сборки, в которых есть все актуальные плюшки вроде пакетного менеджера (и баги, вестимо :))
Макросы и так доставляют неудобства при отладке, так ещё и являются источником вот таких ошибок: макрос 'DO_NUMBER' раскрывается в несколько строк, но только первая их них будет частью условного оператора, последующие же операторы будут выполняться независимо от условия.

Конкретно в этом коде else вообще не нужен, потому что перед этим был переход на обработку исключительной ситуации. Так что по факту код работает, как задумывалось :-)
Так-то да, но это скорее исключение/везение. Любой новый разработчик, который присоединится к проекту, может по-разному воспользоваться этим макросом, считая, что он задан по правилам: один макрос — один блок кода.
Это мне напомнило адский код в Eclipse SDK — MarkerSet#shareStrings (Java):

protected IMarkerSetElement[] elements;

public void shareStrings(StringPool set) {
    //copy elements for thread safety
    Object[] array = elements; // Тип массива заменили на более общий, но виртуальную машину не обманешь
    if (array == null)
        return;
    for (int i = 0; i < array.length; i++) {
        Object o = array[i];
        if (o instanceof String) // Это сравнение заведомо ложно: в исходном массиве строк быть не могло
            array[i] = set.add((String) o); // add возвращает String — пытаемся записать строку 
                                            // в массив IMarkerSetElement[], гарантированный ArrayStoreException в рантайме
        if (o instanceof IStringPoolParticipant)
            ((IStringPoolParticipant) o).shareStrings(set);
    }
}

По факту код работает стабильно: строчка, которая падает с исключением при выполнении, никогда не выполняется из-за заведомо невыполнимого условия перед этим. Когда я вижу такое, начинаю крепко задумываться: писать багрепорт или не беспокоить людей по пустякам :-)
Пишите. Все такие пустяки скапливаются и накладываются друг на друга.
Странно, что код не обёрнут в do { } while(0), как обычно делают для многострочных макросов. Как раз от таких ошибок спасает.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий