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



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

Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

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

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

Сравнительно-исторический метод в языкознании сравнительно-исторический метод в языкознании является одним из основных и представляет собой совокупность приёмов...

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

Конституционно-правовые нормы, их особенности и виды Характеристика отрасли права немыслима без уяснения особенностей составляющих ее норм...

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

Вопрос. Отличие деятельности человека от поведения животных главные отличия деятельности человека от активности животных сводятся к следующему: 1...

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

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