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

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

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 оперирует с двумя категориями...


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


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

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

Йодометрия. Характеристика метода Метод йодометрии основан на ОВ-реакциях, связанных с превращением I2 в ионы I- и обратно...

Броматометрия и бромометрия Броматометрический метод основан на окислении вос­становителей броматом калия в кислой среде...

Основные симптомы при заболеваниях органов кровообращения При болезнях органов кровообращения больные могут предъявлять различные жалобы: боли в области сердца и за грудиной, одышка, сердцебиение, перебои в сердце, удушье, отеки, цианоз головная боль, увеличение печени, слабость...

Вопрос 1. Коллективные средства защиты: вентиляция, освещение, защита от шума и вибрации Коллективные средства защиты: вентиляция, освещение, защита от шума и вибрации К коллективным средствам защиты относятся: вентиляция, отопление, освещение, защита от шума и вибрации...

Задержки и неисправности пистолета Макарова 1.Что может произойти при стрельбе из пистолета, если загрязнятся пазы на рамке...

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