Справочные данные по языку C++_____________________________609

В данном случае аргумент макроса является выражением, содержащим пере-
у?"';ые а и Ь. Поэтому вычисления будет осуществляться не во время компиля-
:; ;i во время выполнения программы.

)братите внимание на круглые скобки вокруг каждого включения параметра
< ексте рассмотренного макроса и вокруг всего выражения. При вызове типа
C1RC(4) они кажутся излишними. Но во втором примере вызова при отсутствии
скобок расширение привело бы к оператору:

3 = 3.14159 * а + b * а + b;

Тогда в соответствии со старшинством операций сначала выполнилось бы ум-
ножение 3.14159 * а, затем b * а, а затем результаты этих умножений сложились
бы друг с другом и с b. Конечно результат вычислений был бы неверным.

Хороший стиль программирования

При объявлении макроса заключайте в скобки параметры в замещающем тексте и сам заме-
щающий текст. Это избавит от возможных неприятностей, связанных с неверной последова-
тельностью вычислений при расширении макроса.

Приведем еще один пример: макрос, определяющий площадь эллипса через
значения его полуосей может быть объявлен директивой

Bdefine Eli(x,y) (3.14159 * (х) * (у))
Вызов этого макроса может иметь вид:

= Ell(Rl, R2) ;

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

ipen:

iouble circ(double x)
return 3.14159 * x * x;

! .дывать ее оператором:

'- = circ(a + b) ;

Таким образом, возникает вопрос, что выгоднее использовать: макросы или

щии.

Вызов функции сопряжен с накладными расходами и затягивает выполнение
зрограммы. Это соображение работает в пользу использования макросов. С другой
стороны, макрос расширяется во всех местах текста, где используется его вызов.
Ес;;и таких мест в программе много, то это увеличивает размер текста и, соответст-
ii'iii'o, размер выполняемого модуля. Так что функции позволяют сокращать объ-

..шолняемого файла, а макросы — сокращать скорость выполнения. Правда,

псы тоже могут быть связаны с дополнительными накладными расходами. В

•денном примере значение параметра а + b вычисляется дважды, в то время,
:s функции это вычисление осуществляется только один раз. Конечно, для га-
простых вычислений это не существенно. Но если в качестве параметра пере-

•я сложное выражение, обращающееся в свою очередь к каким-нибудь слож-
функциям, то эти дополнительные накладные расходы могут стать заметны-

• затянуть вычисления.

Недостатком макросов является отсутствие встроенного контроля согласова-
типов аргументов и формальных параметров. Отсутствие соответствующих
упреждений компилятора может приводить к ошибкам программы, которые
~у; ,но отлавливать. Но наиболее существенный недостаток макросов — возмож-
ность появления побочных эффектов, если в качестве аргумента в макрос переда-

:0 Зак.764