Студопедия Главная Случайная страница Обратная связь

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

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; просмотров: 403. Нарушение авторских прав; Мы поможем в написании вашей работы!




Кардиналистский и ординалистский подходы Кардиналистский (количественный подход) к анализу полезности основан на представлении о возможности измерения различных благ в условных единицах полезности...


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


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


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

Билиодигестивные анастомозы Показания для наложения билиодигестивных анастомозов: 1. нарушения проходимости терминального отдела холедоха при доброкачественной патологии (стенозы и стриктуры холедоха) 2. опухоли большого дуоденального сосочка...

Сосудистый шов (ручной Карреля, механический шов). Операции при ранениях крупных сосудов 1912 г., Каррель – впервые предложил методику сосудистого шва. Сосудистый шов применяется для восстановления магистрального кровотока при лечении...

Трамадол (Маброн, Плазадол, Трамал, Трамалин) Групповая принадлежность · Наркотический анальгетик со смешанным механизмом действия, агонист опиоидных рецепторов...

Машины и механизмы для нарезки овощей В зависимости от назначения овощерезательные машины подразделяются на две группы: машины для нарезки сырых и вареных овощей...

Классификация и основные элементы конструкций теплового оборудования Многообразие способов тепловой обработки продуктов предопределяет широкую номенклатуру тепловых аппаратов...

Именные части речи, их общие и отличительные признаки Именные части речи в русском языке — это имя существительное, имя прилагательное, имя числительное, местоимение...

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