Лекции Булатицкий Дмитрий Иванович (во многом по материалам Прасолова А. Н.)
Скачать 319.62 Kb.
|
Интерфейс и реализация модуля на языке СиУсловная компиляцияПрепроцессор обрабатывает текст программы перед компиляцией. Включение файлов (рассмотрено ранее): #include #include "d:\\user\\ff.h" - файл ищется по правилам MS DOS. Текстовые подстановки (рассматривалось ранее): #define N 21 #define ABC (a*b*c+\ d*sin(x)) \ - переход на следующую строку. Создание макросов. #define SQR(x) ((x)*(x)) В результирующую строку подставляется фактическая строка x. Например, если в тексте программы встречается SQR(y), то после макрораскрутки получим ((y)*(y)). Скобки нужны для того, чтобы не получилось недоразумений, например #define SQR(x) x*x SQR(y+2); превратится в y+2*y+2; Конечно, это не то, что хотелось. Отмена ранее созданного имени: #undef SQR. Условная компиляция: #if константное выражение . . строки программы . #else . . строки программы . #endif Если константное выражение истинно, то в программу будут включены строки из первого блока, иначе из второго. Пример: #define DEBUG 1 . . . #if DEBUG printf("%d", x); #endif Можно проверить наличие или отсутствие какого-либо имени: #ifdef имя (если имя определено, то истина) . . . #else . . . #endif #ifndef имя (если имя не определено) . . . #else . . . #endif Это свойство широко используется в библиотечных включаемых файлах, чтобы избежать противоречия. Например, в conio.h имеются следующие строки: #ifndef COLORS enum COLORS {BLACK, ...}; #endif С помощью условного выражения можно, например, определить макросы max и min: #define max(x,y) ((x)>(y) ? (x):(y)) #define min(x,y) ((x)<(y) ? (x):(y)) При этом макросы max и min будут работать для любых типов арифметических данных. Например: a = max(b,c); Понятие о препроцессоре (сюда??)Препроцессором называется составная часть компилятора, которая производит обработку исходного текста программы перед ее трансляцией. Управление работой препроцессора осуществляется с помощью специальных директив. Все директивы препроцессора начинаются со знака #. Ранее была рассмотрена директива include. Вместо нее в исходный текст программы препроцессор вставляет содержимое файла, указанного в директиве. Так, по директиве #include Если в директиве #include имя файла заключено в кавычки, то вставляемый файл вначале ищется по правилам, предусмотренным MSDOS, а только потом в специальном системном каталоге. Например, по директиве препроцессора #include "func.h" будет осуществлена вставка текста из файла func.h, находящегося в текущем каталоге текущего диска. Директива #define используется для назначения символических имен различным строкам текста. Например, директива: #define PI 3.14159 осуществляет назначение имени PI строки 3.14159. В дальнейшем, вместо 3.14159 в программе можно использовать имя PI. Вместо него перед трансляцией программы препроцессор подставит соответствующую строку. В принципе строка может быть сколь угодно сложной, например: #define TITLE printf("-------sin(x)-------cos(x)-------"); Однако использовать такие конструкции не рекомендуется ввиду сложности отыскания ошибок. |