Рассмотрим пример:
#define WIDTH 80
#define LENGTH (WIDTH+10)
Данные директивы заменят в тексте программы каждое слово WIDTH на число 80 и любое слово LENGTH на
выражение (80+10) вместе с окружающими его скобками.
Скобки, которые содержатся в макроопределении,
дают возможность избежать недоразумений, связан-
ных с порядком вычисления операций. К примеру, если
в скобках выражение 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 для определенного идентификатора.