Здравствуйте, lord_206, Вы писали:
Небольшой оффтопичный комментарий:
_>#define MAP_STYLE(src, dest) if(dwStyle & (src)) dwText |= (dest)
_>#define NMAP_STYLE(src, dest) if(!(dwStyle & (src))) dwText |= (dest)
Такой код таит в себе опасность.
if(something)
MAP_STYLE(x,y);
else // этот else будет относиться к if внутри макроса
MAP_STYLE(z,t);
Простое заворачивание в фигурные скобки — тоже не выход: ';' после макроса окажется лишней (и может сыграть злую шутку)
#define MAP_STYLE(x,y) {.....}
if(something)
MAP_STYLE(x,y); // ';' закрывает вcю конструкцию if...
else // error: 'else' without 'if'
.....
Есть несколько выходов из положения:
// 1) сделать ветвление выражением, а не стейтментом
#define IF(cond,onTrue) ( (cond) ? (void)(onTrue) : (void)0 )
// 2) перетащить условие в ветку else
#define IF(cond,onTrue) if(!(cond)) {} else onTrue
// 3) завернуть конструкцию в do-while (правда, в onTrue)
#define IF(cond,onTrue) do{ if(cond) onTrue; }while(false)