Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Примеры. Макроподстановки реализуются директивой #define, которая имеет следующий синтаксис:




Макроподстановки

Макроподстановки реализуются директивой #define, которая имеет следующий синтаксис:

#define <идентификатор> <текст>

#define <идентификатор> (<список параметров>) <текст>

Директива #define заменяет все вхождения идентификатора в исходном файле на текст, следующий в директиве за идентификатором. Этот процесс называется макроподстановкой. Идентификатор заменяется лишь в том случае, если он представляет собой отдельную лексему. Например, если идентификатор является частью строки или более длинного идентификатора, он не заменяется.

Текст представляет собой набор лексем, таких как ключевые слова, константы, идентификаторы или выражение. Один или более пробельных символов должны отделять текст от идентификатора (или от заключённых в скобки параметров). Если текст не умещается на строке, то он может быть продолжен на следующей строке, для этого следует набрать в конце строки символ «обратный слэш» и сразу за ним нажать клавишу «ВВОД».

Текст может быть опущен. В этом случае все экземпляры идентификатора будут удалены из исходного текста программы. Тем не менее, сам идентификатор рассматривается как определённый.

Список параметров, если он задан, содержит один или более идентификаторов, разделённых запятыми, и должен быть заключён в круглые скобки. Идентификаторы в списке должны отличаться друг от друга. Их область действия ограничена макроопределением, в котором они заданы. Имена формальных параметров в тексте отмечают позиции, в которые должны быть подставлены фактические аргументы макровызова.

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

После того как выполнена макроподстановка, полученная строка вновь просматривается для поиска других имен макроопределений. При повторном просмотре не принимается к рассмотрению имя ранее произведенной макроподстановки. Поэтому директива #define x x не приведет к зацикливанию препроцессора.

#define N 100 #define MULT(a, b) ((a) * (b)) #define MAX(x, y) ((x) > (y))? (x): (y)

Вызов MULT(x + y, z) будет заменен на ((x + y) * (z)). При отсутствии внутренних скобок получилось бы (x + y * z), что неверно.

Макровызов MAX(i, a[i++]) заменится на ((i) > (a[i++]))? (i): (a[i++])). Результат вычисления непредсказуем.

В директиве #define две лексемы могут быть «склеены» вместе. Для этого их нужно объединить знаками ## (слева и справа допустимы пробельные символы). Препроцессор объединяет такие лексемы в одну. Например, макроопределение #define VAR(i, j) i ## j при макровызове VAR(x, 6) образует идентификатор x6.

Символ #, помещаемый перед аргументом макроопределения, указывает на необходимость преобразования его в символьную строку. При макровызове конструкция #<формальный параметр> заменяется на " <фактический параметр> ".

Замены в тексте можно отменить директивой #undef, которая имеет следующий синтаксис:

#undef < идентификатор >

Директива #undef отменяет действие текущего определения #define для идентификатора. Чтобы отменить макроопределение, достаточно задать его идентификатор. Задание списка параметров не требуется. Не является ошибкой применение директивы #undef к идентификатору, который ранее не был определён или действие которого уже отменено.

Принятая в С/С++ форма макросов является серьезным недостатком языка. Теперь эту форму можно считать устаревшей благодаря наличию более подходящих средств языка, таких как шаблоны, пространства имён, встраиваемые функции и константы. Точно также, широкое использование приведений типа в любом языке сигнализирует о плохом проектировании. Как макросы, так и приведения являются частыми источниками ошибок. Тот факт, что без них можно обойтись, делает программирование на С++ гораздо более безопасным и элегантным.




Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 562; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.