Программирование.

18. Применение директив.

Рассмотрим пример:

#dеfinе WIDТН 80.

#dеfinе LЕNGТН (WIDТН+10).

Данные директивы заменят в тексте программы каж дое слово WIDТН на число 80 и любое слово LЕNGТН н выражение (80+10) вместе с окружающими его скобками.

Скобки, которые содержатся в макроопределении дают возможность избежать недоразумений, связан ных с порядком вычисления операций. К примеру, есл1 в скобках выражение t = LЕNGТН*7 будет преобразова но в выражение t = 80 + 10*7, а не в выражение t = (80 – + 10)*7, как это получается, если есть скобки, в резуль тате будем иметь 780, а не 630.

Во второй синтаксической форме в директиве #dеfinе присутствует список формальных параметров, которы может включать в себя один или несколько идентифика торов, которые разделены запятыми. Формальные пара метры в тексте макроопределения отмечают позиции на которые должны быть подставлены фактические ар гументы макровызова. Любой формальный параметр способен появиться в тексте макроопределения несколь ко раз.

При макровызове за идентификатором следует спи сок фактических аргументов, количество которых сле дует сделать совпадающим с количеством формальны параметров.

Пример:

#dеfinе МАХ(х,у) ((х) > (у))?(х): (у).

Приведенная директива заменит фрагмент t = = МАХ(i,s[i]) на выражение t = ((i) > (s[i])?(i): (s[i]).

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

Например, если есть скобки, фрагмент.

T = МАХ(i&j, s[i]||j) будет заменен выражением.

T = ((i&j) > (s[i]||j)?(i&j): (s[i]||j); а если скобок нет – фрагментом.

T = (i&j>s[i]||j)?i&j: s[i]||j;

Где условное выражение вычисляется в другом порядке.

Директива #undеf применяется для отмены действия директивы #dеfinе. Синтаксис данной директивы следующий: #undеf идентификатор.

Директива отменяет операцию текущего определения #dеfinе для определенного идентификатора.