Аргумент параметризированного макроса не должен появляться в правой части более одного раза
Макрос SQUARE()
даже в своем модифицированном виде представил выше серьезную проблему. Дано:
#define SQUARE(x) ((x)*(x))
Выражение SQUARE(++x)
дважды инкрементирует x. После чего макрос в этом случае дает неверный результат. Если x
вначале содержит 2, то SQUARE(++x)
вычисляется как 3 * 4. Такое поведение есть пример побочного эффекта макроса —
ситуации, когда макрос ведет себя неожиданно.
SQUARE(++x)
также показывает пример ситуации, в которой использование макроса просто слишком рискованно для оправдания сложностей сопровождения. Встроенная функция Си++ или шаблон, расширяемый до встроенной функции, являются более удачными решениями. Даже в Си простую функцию с неудачными аргументами легче сопровождать, чем эквивалентный макрос:
double square( double x )
{
return x * x;
}
Но, тем не менее, у меня есть серьезное сомнение в том, что использование функции для скрытия простого умножения является стоящим делом.