write_bit(buffer, 1);
write_bit(buffer, 0);
write_bit(buffer, 1);
write_bit(buffer, 1);
write_bit(buffer, 1);
write_bit(buffer, 0);
write_bit(buffer, 1);
write_bit(buffer, 1);
Каждая из write_bit может вернуть ошибку(-1). Неужели каждый раз нужно проверять? Можно что-то придумать чтобы не надо было проверять?
for loop if( -1) dohandling()
замени на write_byte(buffer, 0xbb); 😁
я в некоторых своих проектах подобный макрос использую: #define PROPAGATE(x) do { Result _result = (x); if (_result != RESULT_SUCCESS) return _result; } while (0)
do while(0) бы заменить на Статик ассерт и норм
во первых static_assert это C11. Во вторых честно говоря не понимаю как его тут применить, и чем оно будет лучше do {} while (0)
#define PROPAGATE(x) { \ Result _result = (x); \ if (_result != RESULT_SUCCESS) \ return _result; \ } _Static_assert(1, "")
и чем оно лучше do {} while (0)?
Оно никак не мешает генерации кода, в отличии от do while(0)
уж компилятор который умеет в C11 то осилит оптимизировать do {} while (0)
Там дело не в том, что компиль не соптимизирует конкретно этот цикл, а в том, что оптимизации окружающего кода могут отработать некорректно. Ну например компиль может инвариант вынести, если инвариант под условием - доп джамп.
у этого макроса ещё следующая небольшая проблема - с ним Result foo(void) PROPAGATE(...); становится валидным кодом.
Этот цикл настолько популярный для обертки, что я думаю в компиляторе есть специальная его обработка. Ну вот в принципе, если не делать int const, то выражение анализируется как полное.
Обсуждают сегодня