Наверное каждый программист разрабатыващий ПО на С\С++ писал макросы сталкивался с некоторой хитростью, которая приводит к интересному и малопонятному багу, при попытке использовать их как функции. Приведу пример, допустим есть макрос возврата минимального числа из двух:
#define M_MIN(A,B) ( ((A) < (B)) ? (A) : (B) )
При попытке исползования в следующем коде:
int a = 2, b = 4;
int c = M_MIN(a++, b);
мы почему-то получаем не то что ожидаем! Это связано с тем что подставится в проверку (2++) < 4 , и потом еще раз при подстановке наименьшего ? (3++) , то есть 4 !
Из этого вытекает только одно правило: не использовать макросы, а если без них никак, то не использовать их как функции!!!!
четверг, 3 июня 2010 г.
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий