Разделы презентаций


Тема 8. Препроцессор

Содержание

Информационные технологииТема 8. Препроцессор2Шевченко А. В.Роль препроцессора при компиляции программыПрепроцессорИсходный файл (.cpp)Объектный файл (.obj)КомпиляторДругие файлы (.h)Другие файлы (.h)Другие файлы (.h)ANSI-стандарт языка С описывает фазу, предшествующую переводу исходного кода программы в машинный

Слайды и текст этой презентации

Слайд 1Информационные технологии
Тема 8. Препроцессор
1
Тема 8. Препроцессор
Шевченко А. В.

Информационные технологииТема 8. Препроцессор1Тема 8. ПрепроцессорШевченко А. В.

Слайд 2Информационные технологии
Тема 8. Препроцессор
2
Шевченко А. В.
Роль препроцессора при компиляции программы
Препроцессор
Исходный

файл (.cpp)
Объектный файл (.obj)
Компилятор
Другие файлы (.h)
Другие файлы (.h)
Другие файлы (.h)
ANSI-стандарт языка С описывает фазу, предшествующую

переводу исходного кода программы в машинный код. Такая фаза выполняется препроцессором и включает: * "склеивание строк" - удаление пары \+перевод строки, получение лексем; * обработку лексем - замену текста и макрорасширения; * включение текста из других файлов в исходный файл; * исключение определенных частей кода (условная трансляция).
Информационные технологииТема 8. Препроцессор2Шевченко А. В.Роль препроцессора при компиляции программыПрепроцессорИсходный файл (.cpp)Объектный файл (.obj)КомпиляторДругие файлы (.h)Другие файлы

Слайд 3Информационные технологии
Тема 8. Препроцессор
3
"Склеивание строк" и получение лексем
Шевченко А. В.
Препроцессор

выбрасывает пару символов, состоящую из обратной наклонной черты (\) и

перевода строки (\n). Разделительные символы (пробелы и знаки табуляции) роли при компиляции не играют. Директивы препроцессора начинаются с символа # (этот символ должен стоять в начале строки, но перед ним также могут быть и пробелы) и заканчиваются концом строки.

Пример программы

Show\ Message("Длинная ст\ рока текста");

Длинная строка текста

OK

Пример программы

if( a < b ) c = 5; a += c;

if( a < b ) c = 5; a += c;

Информационные технологииТема 8. Препроцессор3

Слайд 4Информационные технологии
Тема 8. Препроцессор
4
Директивы препроцессора
Шевченко А. В.
Директива
Назначение
#
оператор расширения строк
##
оператор конкатенации

лексем
#define
определение идентификатора или макроса
#undef
отмена определения
#if
оператор условной трансляции
#ifdef
оператор проверки определения
#ifndef
оператор проверки

неопределенного имени

#else

блок else директивы if

#endif

завершение директивы if

#include

включить файл при компиляции

#error

выдача сообщения об ошибке

#line

задает номер следующей сроки

Информационные технологииТема 8. Препроцессор4Директивы препроцессораШевченко А. В.ДирективаНазначение#оператор расширения строк##оператор конкатенации лексем#defineопределение идентификатора или макроса#undefотмена определения#ifоператор условной трансляции#ifdefоператор

Слайд 5Информационные технологии
Тема 8. Препроцессор
5
Предопределенные имена препроцессора
Шевченко А. В.
Препроцессор имеет несколько

заранее определенных идентификаторов и заменяет их специальной информацией. Эти идентификаторы

нельзя повторно переопределять, к ним нельзя применять директиву #undef.

Стандартные имена

__cplusplus Определено, если компилируется код С++. __DATE__ Дата начала компиляции текущего файла. __FILE__ Имя текущего файла. __FUNC__ Имя текущей функции. __LINE__ Номер текущей строки. __STDC__ Определено, если применяется стандарт ANSI. __TIME__ Время начала компиляции текущего файла.

Информационные технологииТема 8. Препроцессор5Предопределенные имена препроцессораШевченко А. В.Препроцессор имеет несколько заранее определенных идентификаторов и заменяет их специальной

Слайд 6Информационные технологии
Тема 8. Препроцессор
6
Включение при компиляции кода из других файлов
Шевченко

А. В.
Текст программы
#include ”file1.h” #include ... Point points[100]; points[0].x = 200; points[0].y =

120; ... double area = PI*R*R;

Файл file1.h

const float PI = 3.14;

Файл file2.h

typedef struct { int x; int y; } Point;

Информационные технологииТема 8. Препроцессор6Включение при компиляции кода из других файловШевченко А. В.Текст программы#include ”file1.h”   #include

Слайд 7Информационные технологии
Тема 8. Препроцессор
7
Определение и отмена определения макроса
Шевченко А. В.
Текст

программы 1
#define MAX 200 ... int data[MAX]; for(int i = 0; i

MAX; i++) data[i] = 0;

Текст программы 2

#define Red 0x0000FF #define Green 0x00FF00 #define Blue 0xFF0000 ... Edit->Color = Red;

С помощью директивы препроцессора #define определяется макрос: #define имя_макроса последовательность_лексем Имя макроса должно отвечать требованиям к другим именам программы. Последовательность лексем заканчивается концом строки (либо \ для продолжения). При компиляции имя макроса заменяется на последовательность лексем. Отменить определение макроса можно с помощью директивы #undef: #undef имя_макроса

Информационные технологииТема 8. Препроцессор7Определение и отмена определения макросаШевченко А. В.Текст программы 1#define MAX 200 ... int data[MAX];

Слайд 8Информационные технологии
Тема 8. Препроцессор
8
Макросы с параметрами
Шевченко А. В.
Текст программы
#define GETINT(var,

edit) \ var = StrToInt(edit->Text) ... int rows; int cols; ... GETINT(rows,

RowsEdit); GETINT(cols, ColsEdit);

rows = StrToInt(RowsEdit->Text); cols = StrToInt(ColsEdit->Text);

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

Информационные технологииТема 8. Препроцессор8Макросы с параметрамиШевченко А. В.Текст программы#define GETINT(var, edit) \   var = StrToInt(edit->Text)

Слайд 9Информационные технологии
Тема 8. Препроцессор
9
Пример использования макроса
Шевченко А. В.
s = 9
s

= 24

Информационные технологииТема 8. Препроцессор9Пример использования макросаШевченко А. В.s = 9s = 24

Слайд 10Информационные технологии
Тема 8. Препроцессор
10
Условная трансляция
Шевченко А. В.
Директивы условной трансляции (#if,

#ifdef, #ifndef, #else, #endif) позволяют выборочно включать в текст программы

некоторые фрагменты в зависимости от значения заданных условий. Директива #if начинает блок условной трансляции, который компилируется при выполнении заданного в директиве условия (константное целое выражение). Директива #ifdef начинает блок условной трансляции, который компилируется, если заданное в директиве имя определено. Директива #ifndef начинает блок условной трансляции, который компилируется, если заданное в директиве имя не определено. Директива #else начинает блок условной трансляции, который компилируется при невыполнении заданного в директиве #if условия. Директива #endif завершает блок условной трансляции.
Информационные технологииТема 8. Препроцессор10Условная трансляцияШевченко А. В.Директивы условной трансляции (#if, #ifdef, #ifndef, #else, #endif) позволяют выборочно включать

Слайд 11Информационные технологии
Тема 8. Препроцессор
11
Пример условной трансляции
Шевченко А. В.
Текст программы
#define DEBUG #define

TRACE ... long password; #ifdef DEBUG #ifdef TRACE ShowMessage(”Точка 1”); #endif

password = 1; #else GetPassword(password); #endif
Информационные технологииТема 8. Препроцессор11Пример условной трансляцииШевченко А. В.Текст программы#define DEBUG #define TRACE    ...

Слайд 12Информационные технологии
Тема 8. Препроцессор
12
Пример условной трансляции
Шевченко А. В.
Текст заголовка lib.h
#ifndef

LIB #define LIB ... const float PI = 3.14; ... #endif
Текст заголовка form1.h
#include ...
Текст

заголовка form2.h

#include ...

Текст программы prog.cpp

#include #include ...

Информационные технологииТема 8. Препроцессор12Пример условной трансляцииШевченко А. В.Текст заголовка lib.h#ifndef LIB #define LIB ... const float PI

Слайд 13Информационные технологии
Тема 8. Препроцессор
13
Расширение символьных строк
Шевченко А. В.
Оператор расширения символьных

строк в макросах # позволяет преобразовать передаваемый макросу аргумент в

символьную строку.

Пример программы

#define message(text)\ ShowMessage(#text); ... message(Информация); ... message("Информация");

Информация

OK

"Информация"

OK

Информационные технологииТема 8. Препроцессор13Расширение символьных строкШевченко А. В.Оператор расширения символьных строк в макросах # позволяет преобразовать передаваемый

Слайд 14Информационные технологии
Тема 8. Препроцессор
14
Конкатенация лексем
Шевченко А. В.
С помощью оператора конкатенации

лексем ## отдельные лексемы "склеиваются" в одну. Оператор ## и

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

Пример программы

#define message(var, num) ShowMessage(var##num); ... int code1 = 200; int code2 = 210; int code3 = 244; ... message(code, 2);

Информационные технологииТема 8. Препроцессор14Конкатенация лексемШевченко А. В.С помощью оператора конкатенации лексем ## отдельные лексемы

Слайд 15Информационные технологии
Тема 8. Препроцессор
15
Нумерация строк и сообщение об ошибке
Шевченко А.

В.
С помощью директивы #line можно назначить номер строки внутри файла:

#line номер_строки [имя_файла]. Директива #error указывает на необходимость прекращения компиляции и вывода сообщения об ошибке: #error текст_сообщения.

Пример программы

#line 100 #ifndef PARAMETER_X #error Ошибка компиляции, не задан параметр X! #endif;

Информационные технологииТема 8. Препроцессор15Нумерация строк и сообщение об ошибкеШевченко А. В.С помощью директивы #line можно назначить номер

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика