Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lesson5.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
83.97 Кб
Скачать

Лекции по курсу программирования на c

Лекция 5. Директивы препроцессора. Макрос с переменным количеством параметров. Версии языка программирования С.

Препроцессор

Препроцессором называется программа, которая вызывается компилятором и обрабатывает исходную программу перед ее компиляцией. Эта программа различает специальные команды, которые называются директивами. Строка с директивой отмечается символом #, который должен быть первым не пробельным символом строки. Этот символ не является составной частью директивы, а только указывает, что данная строка содержит директиву препроцессора. Поэтому после символа # могут располагаться пробелы. Заканчивается директива символом перехода на новую строку \n. Если перед символом перехода на новую строку встретился символ \, то препроцессор считает, что директива продолжается на следующей строке.

После обработки директив препроцессором исходный текст программы передается для обработки компилятору. Отметим также, что препроцессор различает все лексемы языка программирования С.

Директивы #define и #undef

Директива #define определяет символическое имя для констант и выражений языка программирования С. Такое определение называется макроопределением, а символическое имя — макросом.

Если определяется символическое имя константы, то директива #define имеет следующий вид:

#define <имя> <константа>

Здесь имя определяет символическое имя для константы языка программирования С. В этом случае символическое имя также называется символической константой. Например, директива:

#define MAX_VAL 255

определяет символическое имя MAX_VAL для целочисленной константы 255.

Если определяется символическое имя выражения, то директива #define имеет следующий вид:

#define <имя>(<список_параметров>) <выражение>

Здесь имя является символическим именем для выражения языка программирования С, а список_параметров содержит параметры, которые разделены запятыми и входят в выражение. В этом случае символическое имя также называется макрокомандой. Например, следующая директива:

#define MUL(a, b) ((a)*(b))

определяет макрокоманду для умножения двух чисел.

При определении макрокоманды ее параметры следует брать в круглые скобки, чтобы избежать возможных ошибок. Например, в следующем примере:

#define MUL(a, b) (a*b)

int n = MUL(1+2, 2+1); /* с = 1+2*2+1 = 6 */

Переменная n инициализируется числом 6, что явно противоречит намерениям программиста.

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

#define print_int(val) printf("%d\n", val)

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

print_int(10);

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

Директива #undef служит для отмены определения символического имени и имеет следующий синтаксис:

#undef <имя>

После исполнения этой директивы символическое имя нельзя использовать в программе. Например:

#undef MAX_VAL

#undef MUL

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]