Скачать 1.45 Mb.
|
Приложение 3Возможности препроцессора и его вызовПрепроцессор, как мы уже знаем, это программа предварительной обработки исходного текста программы перед этапом компиляции. Чаще всего препроцессор автоматически вызывается на этапе компиляции, если в исходном тексте обнаружена хотя бы одна его директива. Напомним, что признаком директивы препроцессора является символ # (обычно в начале строки). При необходимости продолжения директивы в следующей строке, текущую строку должен завершать символ '\'. Возможности препроцессора языка C: - лексемное замещение идентификаторов; - макрозамещение; - включение файлов исходного текста; - условная компиляция; - изменение нумерации строк и текущего имени файла. Директивы лексемного замещения идентификаторовДиректива определения значения идентификатора: #define ID строка В результате каждое вхождение в исходный текст элемента «ID» заменяется на значение элемента «строка»: #define L_bufs 2048 #define binary int #define WAIT fflush(stdin); getch() #define BEEP sound(800);\ delay(100);\ nosound() Лексемное замещение весьма удобно для сокращения записи повторяющихся фрагментов теста и определения символических констант: #define YES 1 #define NO 2 #define ESC 27 #define Enter 30 которые могут быть в дальнейшем использованы: if (x==ESC) break; BEEP; return(YES); Директива отмены#undef ID Далее по исходному тексту можно назначить новое значение такого идентификатора. МакрозамещениеМакрозамещение - обобщение лексемного замещения посредством параметризации строки директивы define в виде: #define ID(параметр1,... ) строка здесь между элементом «ID» и открывающей скобкой пробелы не допускаются. Такой вариант директивы define иногда называют макроопределением. Элемент «строка» обычно содержит параметры, которые будут заменены препроцессором фактическими аргументами так называемой макрокоманды, записываемой в формате: ID(аргумент1,... ) Пример макроопределения и макрокоманд: #define P(X) printf("\n%s",X) . . . char *x; P(x); // Использование макроопределения P(X) P(" НАЧАЛО ОПТИМИЗАЦИИ"); printf("\n%s",x); // Эквивалентные операторы printf("\n%s"," НАЧАЛО ОПТИМИЗАЦИИ"); В строке макроопределений идентификаторы параметров сложных выражений рекомендуется заключать в круглые скобки: #define МАХ(A,B) ((A)>(B)? (A):(B)) #define ABS(X) ((X)<0? –(X):(X)) Потребность в круглых скобках возникает при опасности искажения смысла вложенных выражений из-за действия правил приоритета операций. Пример искажения смысла операций: #define BP(X) X*X . . . int x,y,z; x=BP(y+z); x=y+z*y+z; x=y+(z*y)+z; Очевидно, что ошибки будут и при следующих вариантах: #define BP(X) (X*X) #define BP(X) (X)*(X) Безопасный вариант: #define BP(X) ((X)*(X)) Иногда источником ошибок может быть символ «точка с запятой» в конце строки макроопределения: #define BP(X) ((X)*(X)); . . . int x,y,z; x=BP(z)-BP(y); y=((z)*(z)); -((y)*(y)); Макроопределение отменяется директивой undef. Идентификаторы макроопределений обычно составляют из прописных букв латинского алфавита. Это позволяет отличать макрокоманды от вызова функций. Макрокоманда внешне синтаксически эквивалентна операции вызова функции, но смысл их различен. Функция в программе имеется в одном экземпляре, но на ее вызов тратится время для подготовки параметров и передачи управления. Каждая макрокоманда замещается соответствующей частью макроопределения, но потерь на передачу управления нет. Подключение файлов исходного текстаНапомним, что имеются два варианта запроса включения в текущий файл содержимого другого файла. Директива: #include < ID_файла> вводит содержимое файла из стандартного каталога (обычно - \include\), а директива: #include " ID_файла" организует последовательный поиск в текущем, системном и стандартном каталогах. Например: #include // Средства распределения памяти #include // Обращения к функциям ОС #include "a:\prs\head.h" // Включение файла пользователя В стандартных каталогах системы программирования помещены операторы описания внутренних функций языка C, системных переменных среды исполнения, структур данных файловой системы, строк диагностических сообщений, определения констант и т.п. Рекомендуется описания системных объектов включать из стандартных каталогов и размещать их в начале файла исходного текста программы. Системные объекты в результате получают атрибут области действия "глобальный", что устранит неоднозначность их описания. Условная компиляцияДирективы условной компиляции и реализуемые правила включения исходного текста: а) условное включение (аналог работы оператора if): #if<�предикат_условия> ТЕКСТ_1 #endif б) альтернативное включение (аналог if-else): #if<�предикат_условия> ТЕКСТ_1 #else ТЕКСТ_2 #endif Виды предикатов условий: константное_выражение истина, если его значение не равно нулю; def ID истина, если «ID» был определен ранее оператором #define; ndef ID истина, если «ID» не был определен оператором #define. Константное_выражение отделяется от ключевого слова if разделителем, а def и ndef - нет. Пример: #ifdef DEBUG print_state(); #endif Элементы исходного текста "ТЕКСТ_1" или "ТЕКСТ_2" могут содержать любые директивы препроцессора. Примеры: #ifndef EOF #define EOF -1 #endif #if UNIT==CON #include "conproc.c" #else #include "outproc.c" #endif Изменение нумерации строк и идентификатора файлаПо умолчанию диагностические сообщения компилятора привязываются к номеру строки и ID файла исходного текста. Директива #line номер_строки ID_файла позволяет с целью более приметной привязки к фрагментам текста изменить номер текущей строки и ID файла на новые значения («ID_файла» можно опустить). В системе программирования TURBO-C оператор line игнорируется. Св. план 2004, поз. 27 Учебное изданиеБусько Виталий Леонидович, Корбит Анатолий Григорьевич, Кривоносова Татьяна Михайловна Конспект лекций по курсу ОСНОВЫ АЛГОРИТИМЗАЦИИ И ПРОГРАММИРОВАНИЯ для студентов всех специальностей и всех форм обучения Редактор Е.Н.БатурчикКомпъютерная верстка Т.В.Шестакова Подписано в печать Формат 60x84 1/16. Бумага офсетнаяПечать ризографическая Гарнитура «Ариал» Усл. печ. л. Уч.-изд.л. Тираж 500 экз. Заказ . Издатель и полиграфическое исполнение:Учреждение образования«Белорусский государственный университет информатики и радиоэлектроники»Лицензия ЛП № 156 от 05.02.2001.Лицензия ЛВ № 509 от 03.08.2001.220013, Минск, П.Бровки, 6. |
Республики Беларусь Учреждение образования белорусский государственный... |
Республики Беларусь Учреждение образования белорусский государственный... |
||
Республики Беларусь Учреждение образования белорусский государственный... |
Государственное образовательное учреждение высшего профессионального... ... |
||
27 июля 2011 г. N 194 о документах об образовании, приложениях к... Овления Совета Министров Республики Беларусь от 19 июля 2011 г. N 969 "О делегировании полномочий Правительства Республики Беларусь... |
М инистерство здравоохранения республики беларусь уо «Гомельский... Гомель, Республика Беларусь, приглашает студентов и молодых ученых Вашего вуза принять участие в III республиканской научно-практической... |
||
Лабораторная работа №2 по дисциплине «Физика-1» Томский государственный университет систем управления и радиоэлектроники (тусур) Факультет дистанционного обучения |
Об утверждении Инструкции о порядке подготовки и выпуска учебных изданий и их использования На основании части второй пункта 9 статьи 94 Кодекса Республики Беларусь об образовании Министерство образования Республики Беларусь... |
||
Министерства образования республики беларусь О внесении изменений и дополнений в постановление Министерства образования Республики Беларусь от 26 февраля 2008 г. №16 |
Положение о проведении республиканского конкурса программ объединений... Планом работы Министерства образования Республики Беларусь на 2013 год, планом основных республиканских мероприятий учреждения образования... |
Поиск на сайте Главная страница Литература Доклады Рефераты Курсовая работа Лекции |