Правила программирования на Си и Си++

       

Аргумент параметризированного макроса не должен появляться в правой части более одного раза


Макрос SQUARE()

даже в своем модифицированном виде представил выше серьезную проблему. Дано:

#define SQUARE(x)   ((x)*(x))

Выражение SQUARE(++x)

дважды инкрементирует x. После чего макрос в этом случае дает неверный результат. Если x

вначале содержит 2, то SQUARE(++x)

вычисляется как 3 * 4. Такое поведение есть пример побочного эффекта макроса —

ситуации, когда макрос ведет себя неожиданно.

SQUARE(++x)

также показывает пример ситуации, в которой использование макроса просто слишком рискованно для оправдания сложностей сопровождения. Встроенная функция Си++ или шаблон, расширяемый до встроенной функции, являются более удачными решениями. Даже в Си простую функцию с неудачными аргументами легче сопровождать, чем эквивалентный макрос:

double  square(  double  x )

{

    return x * x;

}

Но, тем не менее, у меня есть серьезное сомнение в том, что использование функции для скрытия простого умножения является стоящим делом.



Содержание раздела