Рассмотрим пример:#define WIDTH 80#define LENGTH (WIDTH+10)Данные директивы заменят в тексте программы каж дое слово WIDTH на число 80 и любое слово LENGTH н выражение (80+10) вместе с окружающими его скобкамиСкобки, которые содержатся в макроопределении дают возможность избежать недоразумений, связан ных с порядком вычисления операций. К примеру, есл1 в скобках выражение t = LENGTH*7 будет преобразова но в выражение t = 80 + 10*7, а не в выражение t = (80 – + 10)*7, как это получается, если есть скобки, в резуль тате будем иметь 780, а не 630. Во второй синтаксической форме в директиве #define присутствует список формальных параметров, которы может включать в себя один или несколько идентифика торов, которые разделены запятыми. Формальные пара метры в тексте макроопределения отмечают позиции на которые должны быть подставлены фактические ар гументы макровызова. Любой формальный параметр способен появиться в тексте макроопределения несколь ко раз. При макровызове за идентификатором следует спи сок фактических аргументов, количество которых сле дует сделать совпадающим с количеством формальны параметров. Пример:#define MAX(x,y) ((x) > (y))?(x): (y)Приведенная директива заменит фрагмент t = = MAX(i,s[i]) на выражение t = ((i) > (s[i])?(i): (s[i]). Как и в ранее приведенном примере, круглые скобки, в которые заключены формальные параметры макроопределения, дают возможность избежать ошибок, связанных с неправильным порядком осуществления, если фактические аргументы являются выражениями. Например, если есть скобки, фрагментt = MAX(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;где условное выражение вычисляется в другом порядке. Директива #undef применяется для отмены действия директивы #define. Синтаксис данной директивы следующий: #undef идентификатор. Директива отменяет операцию текущего определения #define для определенного идентификатора.