Программирование.
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е для определенного идентификатора.