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

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

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

Виды нарушений опорно-двигательного аппарата у детей В общеупотребительном значении нарушение опорно-двигательного аппарата (ОДА) идентифицируется с нарушениями двигательных функций и определенными органическими поражениями (дефектами)...

Особенности массовой коммуникации Развитие средств связи и информации привело к возникновению явления массовой коммуникации...

Тема: Изучение приспособленности организмов к среде обитания Цель:выяснить механизм образования приспособлений к среде обитания и их относительный характер, сделать вывод о том, что приспособленность – результат действия естественного отбора...

Травматическая окклюзия и ее клинические признаки При пародонтите и парадонтозе резистентность тканей пародонта падает...

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

Принципы и методы управления в таможенных органах Под принципами управления понимаются идеи, правила, основные положения и нормы поведения, которыми руководствуются общие, частные и организационно-технологические принципы...

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