Блок кода, определенный директивой «match
Что делает директиву «match
match =TRUE, DEBUG { include 'debug.inc' }
здесь файл будет включен, только если символьная константа «DEBUG
TRUE
».2.3.7 Порядок обработки
При сочетании разных свойств препроцессора важно знать порядок, в котором они обрабатываются. Кат уже было отмечено, высший приоритет имеет директива «fix
V fix {
macro empty
V
V fix }
V
делает допустимое определение пустого макроса. Можно сказать, что директива «fix
Стандартный препроцессинг, который начинается после, на каждой строке начинается с распознавания первого символа. Сначала идет проверка на директивы препроцессора, и если ни одна из них не опознана, препроцессор проверяет, является ли первый символ макроинструкцией. Если макроинструкция не найдена, препроцессор переходит ко второму символу на строке, и снова начинает с проверки на директивы, список которых в этом случае ограничивается лишь «equ
Продемонстрируем это на примере. Пусть «foo
bar
» — это структура. Эти строки:foo equ
foo bar
обе будут интерпретированы как вызовы макроса «foo
Макроинструкции генерируют новые строки от их блоков определения, заменяя параметры на их значения и далее обрабатывая операторы «#
`
». Оператор конверсии имеет высший приоритет, чем оператор сцепления.После завершения этого, заново сгенерированная строка проходит через стандартный препроцессинг, как описано выше.
Хотя обычно символьные константы заменяются исключительно в строках, нет ни директив препроцессора, ни макроинструкций, встречается несколько особых ситуаций, где замены проводятся в частях строк, содержащих директивы. Первая — это определение символьной константы, где замены производятся везде после слова «equ
match
», где замены производятся в символах, следующих за запятой перед сопоставлением их с образцом. Эти свойства могут использоваться, например, для сохранения списков, как, например, эта совокупность определений:list equ
macro append item
{
match any, list \{ list equ list,item \}
match, list \{ list equ item \}
}
Здесь константа «list
append
» может использоваться для добавления новых пунктов к списку, разделяя их запятыми. Первое сопоставление в этом макросе происходит, только если значение списка непусто (смотрите 2.3.6), таким образом новое его значение — это предыдущее с запятой и новым пунктом, добавленным в конец. Второе сопоставление происходит, только если список все еще пуст, и таким образом список определяется как содержащий только лишь новый пункт. Так, начиная с пустого списка, «append 1
» определит «list equ 1
», а «append 2
», следующий за ним, определит «list equ 1,2
». Может потребоваться использовать этот список как параметры к некоторому макросу. Но это нельзя сделать прямо — если «foo
» это макрос, то в строке «foo list
» символ «list
» просто прошел бы как параметр к макросу, поскольку символьные константы на этой стадии ещё не развернуты. Для этой цели снова оказывается удобна директива «match
»:match params, list { foo params }