использую как минимум в двух случаях: 1. для обрамления определения макроса, выполняющего несколько операций зараз (a-la inline-функция)
#define LED(L) do{FP_LED_R = ((L) & 0x01); FP_LED_G = (((L)>>1) & 0x01);}while(0) /* Включаем двухцветный светодиод с определенным цветом */
простое обрамление в фигурные скобки даст ошибку в случае такого вызова макроса:
if (condition1)
LED(GREEN); // вызов макроса будет вида {...}; <- компилятор ругнется на точку с запятой
else
LED(ORANGE); // снова вызов макроса
необрамление операций в макросе вообще ничем - еще более опасная вещь, очевидно.
ссылки в тему:
http://stackoverfl …-0-what-is-it-good-for
http://stackoverfl …ns/2687569/c-do-while0
2. если надо однократно выполнить блок действий, но при ошибке в любой операции - перейти сразу к следующему блоку. можно использовать goto, но если не хочется использовать неправославный оператор, то можно блок обрамить do {} while(0); и выйти по break за блок в любой момент. что-то типа так:
do
{
x = foo1(a, b, c);
if(x == 0) break;
y = foo2(x, d, e);
if(y == 2) break;
// etc etc
}
while(0);
// прочие действия