четверг, 3 июня 2010 г.

Использование макросов при разработке на С\С++

Наверное каждый программист разрабатыващий ПО на С\С++ писал макросы сталкивался с некоторой хитростью, которая приводит к интересному и малопонятному багу, при попытке использовать их как функции. Приведу пример, допустим есть макрос возврата минимального числа из двух:

#define M_MIN(A,B) ( ((A) < (B)) ? (A) : (B) )

При попытке исползования в следующем коде:

int a = 2, b = 4;
int c = M_MIN(a++, b);

мы почему-то получаем не то что ожидаем! Это связано с тем что подставится в проверку (2++) < 4 , и потом еще раз при подстановке наименьшего ? (3++) , то есть 4 !

Из этого вытекает только одно правило: не использовать макросы, а если без них никак, то не использовать их как функции!!!!

Комментариев нет: