Студопедия — R.16.3 Макроопределение и макроподстановка
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

R.16.3 Макроопределение и макроподстановка






Команда вида #define идентификатор строка-лексем называется макроопределением. Она указывает препроцессору, что надопроизвести замену всех последующих вхождений идентификатора на заданнуюпоследовательность лексем, называемую строкой замены. Обобщенныепробелы, окружающие эту последовательность лексем, отбрасываются.Например, при определении #define SIDE 8 описание char chessboard[side][side]; после макроподстановки примет вид char chessboard[8][8]; Определенный таким способом идентификатор можно переопределитьс помощью другой команды #define, но при условии, что строкизамены в обоих определениях совпадают. Все символы обобщенногопробела, разделяющие лексемы, считаются идентичными. Команда видаидентификатор (идентификатор,...,идентификатор) строка-лексемназывается макроопределением с параметрами или "функциональным"макроопределением. В нем недопустимы пробелы между первымидентификатором и символом (. Определенный таким способомидентификатор можно переопределить с помощью другого функциональногомакроопределения, но при условии, что во втором определениито же число и те же наименования параметров, что и в первом, а обестроки замены совпадают. Все символы обобщенного пробела, разделяющиелексемы, считаются идентичными. Последующие вхождения идентификатора, определенного вфункциональном макроопределении, если за ним следуют символ(, последовательность лексем, разделенных запятыми, и символ), заменяются на строку лексем из макроопределения. Обобщенныепробелы, окружающие строку замены, отбрасываются. Каждое вхождениеидентификатора, из списка параметров макроопределения, заменяетсяна последовательность лексем, представляющую соответствующийфактический параметр в макровызове. Фактическими параметрами являютсястроки лексем, разделенные запятыми. Запятая, взятая в кавычки, илинаходящаяся в символьной константе или во вложенных круглых скобках,не разделяет параметров. Число фактических параметров макровызова должносовпадать с числом параметров макроопределения. После идентификации параметров для функционального макроопределенияпроисходит подстановка фактических параметров. После выполнения подстановокв параметре (если они были) этот параметр в строке замены замещаетсяфактическим параметром из макровызова ($$R.16.3.3); исключениясоставляют случаи, когда параметру предшествует лексема # ($$R.16.3.1),или с ним соседствует лексема ## ($$R.16.3.2). Приведем пример. Пусть есть макроопределения #define index_mask 0XFF00 #define extract(word,mask) word & mask Тогда макровызов index = extract(packed_data,index_mask); после подстановки примет вид index = packed_data & 0XFF00; Для обоих видов макроопределений строка замены проверяется наналичие других макроопределений ($$R.16.3.3).

R.16.3.1 Операция #

Если непосредственно перед параметром в строке замены идет лексема#, то при подстановке параметр и операция # будут замененына строку литералов, содержащую имя соответствующего параметрамакровызова. В символьной константе или строке литералов, входящихв параметр, перед каждым вхождением \ или " вставляется символ \. Например, если есть макроопределения #define path(logid,cmd) "/usr/" #logid "/bin/" #cmd то макровызов char* mytool=path(joe,readmail); приведет к такому результату: char* mytool="/usr/" "joe" "/bin/" "readmail"; После конкатенации соседних строк ($$R.16.1) получим: char* mytool="/usr/joe/bin/readmail";

R.16.3.2 Операция ##

Если в строке замены между двумя лексемами, одна из которыхпредставляет параметр макроопределения, появляется операция##, то сама операция ## и окружающие ее обобщенные пробелыудаляются. Таким образом, результат операции ## состоит вконкатенации. Пусть есть макроопределение, #define inherit(basenum) public Pubbase ## basenum, \ private Privbase ## basenum тогда макровызов class D: inherit(1) { }; приведет к такому результату: class D: public Pubbase1, Privbase1 { }; Макроопределение, которое в строке замены соседствует с##, не подлежит подстановке, однако, результат конкатенации можетиспользоваться для подстановки. Приведем пример. Пусть естьопределения: #define concat(a) a ## ball #define base B #define baseball sport Тогда макровызов concat(base) даст в результате sport а вовсе не Bball






Дата добавления: 2015-09-04; просмотров: 382. Нарушение авторских прав; Мы поможем в написании вашей работы!



Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...

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

ТЕОРЕТИЧЕСКАЯ МЕХАНИКА Статика является частью теоретической механики, изучающей условия, при ко­торых тело находится под действием заданной системы сил...

Виды и жанры театрализованных представлений   Проживание бронируется и оплачивается слушателями самостоятельно...

Что происходит при встрече с близнецовым пламенем   Если встреча с родственной душой может произойти достаточно спокойно – то встреча с близнецовым пламенем всегда подобна вспышке...

Реостаты и резисторы силовой цепи. Реостаты и резисторы силовой цепи. Резисторы и реостаты предназначены для ограничения тока в электрических цепях. В зависимости от назначения различают пусковые...

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

Случайной величины Плотностью распределения вероятностей непрерывной случайной величины Х называют функцию f(x) – первую производную от функции распределения F(x): Понятие плотность распределения вероятностей случайной величины Х для дискретной величины неприменима...

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

Studopedia.info - Студопедия - 2014-2024 год . (0.013 сек.) русская версия | украинская версия