Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 11 лет назад пользователемОльга Федосеева
1 Лекция 10 Препроцессор
2 Препроцессор языка Си Препроцессор работает на первом шаге компиляции. Директивы препроцессора: #include#define#undef #ifdef#if#else #elif#endif#ifndef
3 Включение файлов Директива включение файла: #include "имя-файла" или #include
4 Макроподстановка Определение макроподстановки имеет вид: #define Заменяет встречающуюся в тексте программы лексему имя на замещающий-текст. Пример: #define ROWS 7 /* Кол-во строк */ #define COLS 8 /* кол-во столбцов */ void main() { int a[ROWS][COLS];... }
5 Макроподстановка Подстановка осуществляется только для тех имен, которые расположены вне текстов, заключенных в кавычки. printf("Строк: ROWS, Столбцов: COLS"); выведет на экран: Строк: ROWS, Столбцов: COLS Определение макроподстановки может содержать более ранние макроопределения: Пример: #define ROWS 8 #define COLS (ROWS + 2) /* Выражения лучше указывать */ /* в скобках */ void main() {... for (i = 0; i < COLS * 2; i++)... }
6 Макроподстановка с аргументами Макроподстановку можно определить с аргументами, вследствие чего замещающий текст будет варьироваться в зависимости от задаваемых параметров. Пример: #define max(A, B) ((A) > (B) ? (A) : (B))... x = max(p+q, r+s); max – не функция! x = max(p+q, r+s); Будет заменено на x = ((p+q) > (r+s) ? (p+q) : (r+s));
7 Макроподстановка с аргументами Если в замещающем тексте перед формальным параметром стоит знак #, этот параметр будет заменен на аргумент, заключенный в кавычки. Пример: #define dprint(expr) printf(#expr " = %f\n", expr) Обращение к dprint(x/y); развернется в printf("x/y" " = %f\n", x/y); В результате автоматической конкатенации соседних строк получим: printf("x/y = %f\n", x/y);
8 Макроподстановка с аргументами Оператор ## позволяет в макрорасширениях конкатенировать аргументы. Пример: #define paste(front, back) front ## back paste(name, 1) сгенерирует имя name1
9 Многострочные определения Для продолжения определения на следующих строках, используется наклонная черта \. Пример: #define swap(t,x,y) t = x;\ x = y;\ y = t;
10 Макроподстановка с аргументами («подводные камни») 1. Операции инкремента и декремента в аргументах макроподстановки. Пример: max(i++, j++) /* НЕВЕРНО */ Макрос «развернется» в: ((i++) > (j++) ? (i++) : (j++)) 2. Использование скобок #define square(x) x*x /* НЕВЕРНО */ Результатом square (z+1) будет z + 1 * z + 1, а не (z+1)*(z+1)
11 Условная компиляция Директивы условной компиляции позволяют выборочно включать тот или иной текст программы в зависимости от значения условия, вычисляемого вовремя компиляции. Пример. Включить соответствующий файл для компиляции, в зависимости от операционной системы. #if SYSTEM == WIN32 #define HDR "win32.h" #elif SYSTEM == LINUX #define HDR "linux.h" #elif SYSTEM == MSDOS #define HDR "msdos.h" #else #define HDR "default.h" #endif #include HDR
12 Условная компиляция Выражение defined(имя) имеет значение 1 если имя определено или 0 если нет. Пример. Недопустить повторного включение в программу файла hdr.h: Файл hdr.h: #if !defined(HDR) #define HDR … #endif Файл main.c: #include "hdr.h" … #include "hdr.h" /* второго включения файла уже не произойдет */
13 Условная компиляция Прочие директивы условной компиляции: #ifdef – равносильно #if defined(имя) #ifndef – равносильно #if !defined(имя) #undef – "разопределяет" имя
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.