Обзор директив макроподстановки

К директивам макроподстановки относятся две формы директивы #define:

  • простая, как правило, для определения константы;
  • определение макроса в виде псевдо-функции с параметрами.

Кроме того, существует директива #undef для отмены любого из предыдущих определений #define. Если #undef не используется, каждый определенный макрос действует до конца компиляции исходных кодов.

Макросы регистрируются и затем используются в коде по имени, составленном по правилам идентификаторов. По всеобщей договоренности имена макросов пишутся заглавными буквами. Имена макросов могут перекрывать имена переменных, функций и прочих элементов исходного кода. Целенаправленное использование этого факта позволяет гибко менять и генерировать исходный код на лету. Однако непреднамеренное совпадение имени макроса с элементом программы приведет к ошибкам.

Принцип работы обеих форм макроподстановок общий. С помощью директивы #define вводится идентификатор, которому ставится в соответствие некий фрагмент текста — определение. Если препроцессор находит далее в исходном коде данный идентификатор, он заменяет его на связанный с ним текст. Подчеркнем, что имя макроса может быть использовано в компилируемом коде только после регистрации (это похоже на принципы объявления переменных, но только на стадии компиляции).

Замена имени макроса на его определение называется раскрытием или разверткой (от английского "expand"). Анализ исходного кода происходит поступательно и построчно в один проход, но развертка в каждой строке может производиться произвольное число раз, как в цикле, пока в получившемся результате вновь обнаруживаются имена макросов. Включать в определение макроса его же имя нельзя: при подстановке такой макрос приведет к ошибке "неизвестный идентификатор".

В третьей Части книги мы узнаем о шаблонах, которые также позволяют генерировать (фактически, реплицировать) исходный код, но по другим правилам. При наличии в исходном коде и директив макроподстановки, и шаблонов, первыми раскрываются макросы, а затем генерируется код по шаблонам.

Имена макросов подсвечиваются в редакторе MetaEditor красным цветом.