Макроподстановки реализуются директивой #define, которая имеет следующий синтаксис:
#define <идентификатор> <текст> #define <идентификатор>(<список параметров>) <текст>
Директива #define заменяет все вхождения идентификатора в исходном файле на текст, следующий в директиве за идентификатором. Этот процесс называется макроподстановкой. Идентификаторзаменяется лишь в том случае, если он представляет собой отдельную лексему. Например, если идентификатор является частью строки или более длинного идентификатора, он не заменяется.
Текст представляет собой набор лексем, таких как ключевые слова, константы, идентификаторы или выражение. Один или более пробельных символов должны отделять текст от идентификатора (или от заключённых в скобки параметров). Если текст не умещается на строке, то он может быть продолжен на следующей строке, для этого следует набрать в конце строки символ «обратный слэш» и сразу за ним нажать клавишу «ВВОД».
Текст может быть опущен. В этом случае все экземпляры идентификатора будут удалены из исходного текста программы. Тем не менее, сам идентификатор рассматривается как определённый.
Список параметров, если он задан, содержит один или более идентификаторов, разделённых запятыми, и должен быть заключён в круглые скобки. Идентификаторы в списке должны отличаться друг от друга. Их область действия ограничена макроопределением, в котором они заданы. Имена формальных параметров в тексте отмечают позиции, в которые должны быть подставлены фактические аргументы макровызова.
В макровызове следом за идентификатором записывается в круглых скобах список фактических аргументов, соответствующих формальным параметрам из списка параметров. Списки фактически и формальных параметров должны содержать одно и то же количество элементов. Не следует путать подстановку аргументов в макроопределение с передачей аргументов функции. Подстановка в препроцессоре носит чисто текстовый характер. Никаких вычислений или преобразований типа при этом не производится.
После того как выполнена макроподстановка, полученная строка вновь просматривается для поиска других имен макроопределений. При повторном просмотре не принимается к рассмотрению имя ранее произведенной макроподстановки. Поэтому директива #define x x не приведет к зацикливанию препроцессора.
Достарыңызбен бөлісу: |