Препроцессор позволяет использовать более сложную и полезную форму, директивы #define.
Формат: #define идентификатор (идентификатор, …, идентификатор) строка, где идентификатор – это символичный макроидентификатор. В скобках – это список параметров и строка – подставляемая строка. Обычно она включает параметры. Не должно быть пробелов между макроидентификатором и открывающими сковкой, в противном случае препроцессор будет рассматривать директиву как простую подстановку, а список параметров трактовать как подставляемую строку. Макроподстановка с аргументами аналогично функции. Иногда макроподстановку с аргументом называют псевдофункцией или макроопределением или макросом типа функция. Каждый раз при встрече такого макроса аргументы макроса будут замещаться реальным аргументом программы.
#include<stdio.h>
#define MIN(a,b) ((а)<(b))?(а):(b)
int main(void)
{int x,y;
x=10;
y=20;
printf(“Минимальное число это:%d”, MIN(x,y));
return 0;
}
При компиляции программы вместо MIN(a.b) подставляем выражение (1), причём вместо директивных параметров а и в подставляем реальные х и у. Таким образом, в результате подстановки print имеет вид:
printf(“Минимальное значение:%d”,((x)<(y)?(x):(y));
Необходимо отметить, что каждое появление параметра в появляемой строке должно заключаться в скобки. Вся подставляемая строка тоже должна заключаться в скобки.
Пример: макроопределение, вычисляющее квадрат некоторого значения.
#define KV(X) ((X) ´(X))
Запись макроопределения в виде
#define KV(X) X´X
#define KV(X) (X´X)
#define KV(X) (X)´(X)
приведёт к неверному результату.
Пример:
#define ESCAPE (N) bdos (6,27); bdos (6,(N))
#define CLEAR ESCAPE (69)
#define REVERS ESCAPE (112)
#define MERC ESCAPE (115)
#define NOMERC ESCAPE (116)
#define KURSOR G(x,y) ESCAPE (89); bdos (6,x+32); bdos (6,y+32)
#define NOLREVER ESCAPE (113)
Первое макроопределение обеспечивает передачи ESCAPE символа (десятичный код 27) и далее любого символа, который посылается на экран посредством параметра N. Для этой цели используется библиотечная функция bdos. Имеются функции управляющих последовательностей для установки режимов работы дисплея, а именно, режимов экрана, цвета, света. Можно задать следующие действия: очистить экран, установить «обратное» изображение, отменить «обратное» изображение, установить мерцание, отменить мерцание и т.д. Эти действия задаются с помощью десятичного символа-определителя. Так, например, второе макроопределение очищает экран (код символа определителя 69). Третье макроопределение устанавливает обратное изображение (код символа определителя 112). Код символа определителя 113 отменяет обратное изображение. 4-ое макроопределение устанавливает мерцание (код – 115). Пятое – отменяет мерцание (код – 116). 6-ое – обеспечивает передвижение курсора в позиции х, у (код – 89).