Главная страница

Лекции Булатицкий Дмитрий Иванович (во многом по материалам Прасолова А. Н.)


Скачать 319.62 Kb.
НазваниеЛекции Булатицкий Дмитрий Иванович (во многом по материалам Прасолова А. Н.)
Дата11.01.2022
Размер319.62 Kb.
Формат файлаdocx
Имя файлаLecture_Programming_2021_09_01.docx
ТипЛекции
#328427
страница33 из 36
1   ...   28   29   30   31   32   33   34   35   36

Интерфейс и реализация модуля на языке Си

  • Условная компиляция


    Препроцессор обрабатывает текст программы перед компиляцией.

    1. Включение файлов (рассмотрено ранее):

    #include - файл из специального каталога;

    #include "d:\\user\\ff.h" - файл ищется по правилам MS DOS.

    1. Текстовые подстановки (рассматривалось ранее):

    #define N 21

    #define ABC (a*b*c+\

    d*sin(x))

    \ - переход на следующую строку.

    1. Создание макросов.

    #define SQR(x) ((x)*(x))

    В результирующую строку подставляется фактическая строка x. Например, если в тексте программы встречается SQR(y), то после макрораскрутки получим ((y)*(y)). Скобки нужны для того, чтобы не получилось недоразумений, например

    #define SQR(x) x*x

    SQR(y+2); превратится в

    y+2*y+2;

    Конечно, это не то, что хотелось.

    1. Отмена ранее созданного имени:

    #undef SQR.

    1. Условная компиляция:

    #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);
      1. Понятие о препроцессоре (сюда??)


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

    Ранее была рассмотрена директива include. Вместо нее в исходный текст программы препроцессор вставляет содержимое файла, указанного в директиве.

    Так, по директиве #include в текст программы вставляет содержимое файла stdio.h, находящегося в специальном системном каталоге, а только потом происходит трансляция.

    Если в директиве #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)-------");

    Однако использовать такие конструкции не рекомендуется ввиду сложности отыскания ошибок.

    1. 1   ...   28   29   30   31   32   33   34   35   36


  • написать администратору сайта