Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Козак Н.В. Лекции Основы создания программ в Си...doc
Скачиваний:
31
Добавлен:
23.09.2019
Размер:
2.24 Mб
Скачать

Лекция.3.Препроцессор и отладка программ

Препроцессорная обработка представляет собой первую фазу того процесса, что именуется компиляцией программы на C/C++.

Макроопределения

Макроопределения, называемые в просторечии макросами, определяются директивой препроцессора #define. Можно выделить три формы макросов #define: простое определение символа, определение символической константы и определение макроса с параметрами.

Простое определение выглядит так:

#define NDEBUG

После такой директивы символ ndebug считается определенным Не предполагается, что он что-то означает; он просто — определен (как пустой). Можно было бы написать:

#define NDEBUG l

Всякое вхождение в текст лексемы ndebug препроцессор заменил бы на "1".

#define может определять не только константы. Поскольку препроцессор выполняет просто текстовую подстановку, можно сопоставить символу и любую последовательность операторов:

#define SHUTDOWN \

printf ( "Error!") ; \

return -1

if (ErrorCondition О)

SHUTDOWN; // "Вызов" макроса.

Обратная дробная черта (\) означает, что макрос продолжается на следующей строчке.

Определенный ранее макрос можно аннулировать директивой #undef:

#undef NDEBUG

После этого макрос становится неопределенным, и последующие ссылки на него будут приводить к ошибке при компиляции.

Предопределенные макросы

Компилятор С автоматически определяет некоторые макросы. Их можно разбить на две категории: макросы ANSI и макросы, специфические для конкретного компилятора. Сводка предопределенных макросов ANSI дана в таблице.

Таблица 1 Предопределенные макросы ANSI

Макрос

Описание

__DATE__

Литеральная строка в формате "mmm dd yyyy". представляющая дату обработки данного файла препроцессором.

__FILE__

Строка имени текущего файла (в кавычках).

__LINE__

Целое, представляющее номер строки текущего файла.

__STDC__

Равно 1, если установлена совместимость компилятора со стандартом ANSI (ключ -А командной строки). В противном случае макрос не определен.

__TIME__

Строка в формате "hh:mm:ss", представляющее время препроцессорной обработки файла.

Макросы с параметрами

Макросы могут выполнять не только простую текстовую подстановку. Возможно определение макросов с параметрами, напоминающих функции языка С, например:

#define PI 3.14159265

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

#define AREA(x) (PI * SQR(x))

#define MAX(a,b) ((a)>(b) ? (a):(b))

...

circleArea = AREA(rl + r2);

cMax = MAX(i++, j++);

Третье макроопределение показывает, что макросы могут быть вложенными. После каждого расширения макроса препроцессор снова сканирует полученный текст на предмет того, не содержит ли он идентификаторов, в свою очередь являющихся макросами. Исключением являются случаи, когда расширение содержит собственное имя макроса или является препроцессорной директивой.

Директива #include

Препроцессор заменяет директиву содержимым указанного в ней файла. Есть две ее формы:

#include <filename>

finclude "filename"

В первом случае поиск нужного файла производится только в стандартных каталогах включаемых файлов; во втором случае — в текущем каталоге.