Цитата(Сергей Борщ @ Sep 1 2018, 21:34)

Что будет делать контроллер, получив 1 в нужных позициях и случайные предыдущие значения вместо нулей в остальных (или наоборот, не важно)? Я уже не говорю о лишней записи в регистр. Грамотный программист использует либо конструкцию Reg = (Reg & Mask1) | Mask2, либо ее же, разбитую на два выражения и временную переменную.
Согласен с замечанием.
Так лучше?
Код
// Макрос записи в регистр reg битовой последовательности val в позицию pos (по младшему разряду)
// msk - маска битового поля
#define TuneBitField(reg,val,pos,msk) \
do { \
tmp=reg; \
(tmp) |= (((val) << (pos))&(msk)); \
(tmp) &= (((val) << (pos))|~(msk)); \
reg=tmp; \
} while (0);
Цитата
И еще - грамотный программист сложное выражение в #define обрамляет в do {} while(0)
А здесь - не могу представить себе пример кода, когда обрамляющие фигурные скобки (блок {} ) работают хуже (да просто не точно так же), как конструкция do {} while (0);
Приведите пример, если можете.