Использование макроопределения без параметров имеет существенный недостаток - строка замещения фиксирована. Большие возможности предоставляет макроопределение с параметрами:
#define идентификатор(параметры) строка_замещения
параметры - список идентификаторов, разделенных запятыми. Между именем макроса и скобкой не должно быть пробелов.
Для макровызова используется конструкция вида:
идентификатор (аргументы)
аргументы – список препроцессорных лексем, разделенных запятыми.
Пример:
Макроопределение
#define MAX(x,y) ((x) < (y) ? (x) : (y))
позволяет формировать в программе выражение, определяющее максимальное из двух значений аргументов.
Аргументы макровызова используются при макроподстановке. Например, макровызов
у = MAX(suml, sum2);
он будет заменен на
у = ((suml)>(sum2)?(suml):(sum2));
Отсутствие круглых скобок может привести к неправильному порядку вычисления, поскольку препроцессор не оценивает строку замещения текст с точки зрения синтаксиса.
Пример:
Если определен макрос
#define sqr(x) (x*x)
то макровызов sqr(y+l) будет заменен выражением sqr(у+1*у+1).
Последовательные подстановки, выполняемые в строке замещения, не действуют на параметры макроса, т.е. аргумент макроса не может быть выражением, содержащим переменные, ранее определенные другой директивой #define.