Правила программирования на С и С++. Главы 1-6 Страница 92. Аргумент параметризированного макроса не должен появляться в правой части более одного раза
|
Страница 92 из 93 83. Аргумент параметризированного макроса не должен появляться в правой части более одного раза.
Макрос SQUARE() даже в своем модифицированном виде представил выше серьезную проблему. Дано: #define SQUARE(x) ((x)*(x))Выражение SQUARE(++x) дважды инкрементирует x. После чего макрос в этом случае дает неверный результат. Если x вначале содержит 2, то SQUARE(++x) вычисляется как 3 * 4. Такое поведение есть пример побочного эффекта макроса - ситуации, когда макрос ведет себя неожиданно. SQUARE(++x) также показывает пример ситуации, в которой использование макроса просто слишком рискованно для оправдания сложностей сопровождения. Встроенная функция С++ или шаблон, расширяемый до встроенной функции, являются более лучшими решениями. Даже в С простую функцию с неудачными аргументами легче сопровождать, чем эквивалентный макрос: double square( double x ) { return x * x; } Но тем не менее, у меня есть серьезное сомнение в том, что использование функции для скрытия простого умножения является стоящим делом. 83.1. Никогда не используйте макросы для символьных констант.
Например: #define SPACE ' 'имеет смысл, если только вы намерены использовать вместо пробела другой символ (как если бы вы испытывали, например, программу для замены символов табуляции). Никогда не делайте так: #define SPACE 0x20Действительное значение символьной константы для пробела (' ') изменяется компилятором так, чтобы оно соответствовало операционной среде, для которой ведется компиляция. Для среды, поддерживающей ASCII, это значение будет 0x20, а для EBDCDIC - уже нечто другое. Не думайте, что у какого-то символа свое постоянное значение. |