Реферат: Препроцессор языка C.
При указании аргументов, скобки должны закрываться, а запятая не должна
завершать аргумент. Однако, не существует каких либо ограничений на
использование квадратных или угловых скобок. Например
macro (array[x = y, x + 1])
передает макросу 'macro' два аргумента: 'array[x = y' и 'x + 1]'.
После подстановки указанных аргументов в тело макроса, полученный в
результате текст добавляется к началу оставшихся данных и производится
проверка на наличие других вызовов макросов. Поэтому указываемые аргументы
могут содержать ссылки к другим макросам как с аргументами, так и без, а
также к тому же макросу. Тело макроса также может включать ссылки к другим
макросам. Например, макрос 'min (min (a, b), c)' заменяется следующим
текстом:
((((a) < (b) ? (a) : (b))) < (c)
? (((a) < (b) ? (a) : (b)))
: (c))
(Срока разбита на три для ясности и в действительности она не разбивается.)
Если макрос 'foo' принимает один аргумент и нужно передать ему пустой
аргумент, то в скобках следует указать по крайней мере один пробел:
'foo ( )'. Если пробел не указывать, а макрос 'foo' требует один аргумент,
то произойдет ошибка. Для вызова макроса, не принимающего аргументы, можно
использовать конструкцию 'foo0()' как рассмотрено ниже:
#define foo0() ...
Если используется имя макроса, за которым не следует открывающаяся
скобка (после удаления всех следующих пробелов, символов табуляции и
комментариев), то это не является вызовом макроса и препроцессор не изменяет
текст программы. Поэтому возможно использование макроса, переменной и функции
с одним именем и в каждом случае можно изменять, когда нужно применить макрос
(если за именем следует список аргументов), а когда - переменную или функцию
(если список аргументов отстутствует).