Цитата(_Pasha @ Sep 28 2009, 17:29)

Не-не. Лучше for(){} навернуть функционалом. Чтоб можно было не бояться встретить побочные эффекты от break или return при вызове какого-либо хитрого макроса.
Дык вроде break одинаково отрабатывает что из того цикла, что из другого. Это по continue в for хвостовой оператор выполнится.
do { } while(0) для другого сделан, чтобы макрос можно было ставить в любое место и привычно писать после него ';', тут уже писали
Код
// примитив, но для общности изложения
#define foo() op1; op2;
if(a)
foo(); // в тихую op2 выполняется всегда
if(a)
foo();
else // syntax error
op3;
Код
#define foo() { op1; op2; }
if(a)
foo(); // "висящий" ';' , но это не страшно
if(a)
foo();
else // syntax error
op3;
Код
#define foo() for(int i = 0; i < 1; ++i) { op1; op2; }
if(a)
foo(); // "висящий" ';' , но это не страшно
if(a)
foo();
else // syntax error
op3;
Код
#define foo() do { op1; op2; } while(0)
if(a)
foo(); // OK
if(a)
foo();
else // OK
op3;