"Андрей Богатырев. Хрестоматия по программированию на Си в Unix" - читать интересную книгу автора

#define div(x, y) ((x) / (y))

будет работать правильно.

1.46. Макросы, в отличие от функций, могут порождать непредвиденные побочные
эффекты:

int sqr(int x){ return x * x; }
#define SQR(x) ((x) * (x))
main(){ int y=2, z;
z = sqr(y++); printf("y=%d z=%d\n", y, z);
y = 2;
z = SQR(y++); printf("y=%d z=%d\n", y, z);
}

Вызов функции sqr печатает "y=3 z=4", как мы и ожидали. Макрос же SQR расширяется в

z = ((y++) * (y++));

и результатом будет "y=4 z=6", где z совсем не похоже на квадрат числа 2.

1.47. ANSI препроцессор[*] языка Си имеет оператор ## - "склейка лексем":

#define VAR(a, b) a ## b
#define CV(x) command_ ## x
main(){
int VAR(x, 31) = 1;
/* превратится в int x31 = 1; */
int CV(a) = 2; /* даст int command_a = 2; */
...
}

Старые версии препроцессора не обрабатывают такой оператор, поэтому раньше использо-
вался такой трюк:

#define VAR(a, b) a/**/b

в котором предполагается, что препроцессор удаляет комментарии из текста, не заменяя
их на пробелы. Это не всегда так, поэтому такая конструкция не мобильна и пользо-
ваться ею не рекомендуется.

1.48. Напишите программу, распечатывающую максимальное и минимальное из ряда чисел,
вводимых с клавиатуры. Не храните вводимые числа в массиве, вычисляйте max и min
сразу при вводе очередного числа!

____________________
[*] ANSI - American National Standards Institute, разработавший стандарт на язык Си
и его окружение.

А. Богатырев, 1992-95 - 20 - Си в UNIX