Еще раз повторяю - конструкция do {} while(0) позволяет очень легко изменением только одно места в программе, а именно - самого определения, заменить #define на вызов обычной функции, _не_меняя_ остального исходника.
Вы можете писать свои программы как вам угодно. Вы можете обложить свой #define тоннами комментарииев с описанием всех ограничений, которые из него вытекают и думать, что тем самым облегчаете понимание вашего исходника. Вы можете постоянно натыкаться на ошибки этапа компиляции или этапа выполнения потому что вы забыли про какое-то из этих ограничений.