Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛекцииЛаб(Часть_2_Книги).doc
Скачиваний:
4
Добавлен:
03.05.2019
Размер:
988.16 Кб
Скачать

Команды препроцессора (директивы компиляции)

В интегрированную среду подготовки программ на С++ как обязательный компонент входит препроцессор, который обрабатывает исходный текст программы до её компиляции. Для этого используются его команды, которые ещё называются инструкции компилятору (компиляции), директивы компиляции, директивы (команды) препроцессора, с некоторыми из которых (#include, #define) мы уже кратко знакомы. Такие команды не являются частью языка. Напомним основные синтаксические правила записи команд препроцессора:

  • в одной строке можно записать только одну директиву;

  • каждая из них должна начинаться с символа #;

  • в конце директивы в отличие от операторов символ “точка с запятой” не пишется.

§1. Директива define (замены в тексте)

    1. Простое макроопределение (макрос)

Стандартный вид директивы следующий:

#define идентификатор последовательность_символов

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

Правила записи директивы define:

последовательность символов должна отделяться от идентификатора хотя бы одним пробелом;

пробелы, помещённые в начале и в конце строки замещения, в подстановке не используются;

если последовательность символов должна быть расположена на нескольких строках, то за последним не пробельным символом в строке записывается символ “\” (обратный слеш). В ходе препроцессорной обработки этот символ вместе с последующим символом конца строки будет удалён из текста программы ( см. пример3);

замена не производится в строковых и символьных константах и в комментариях;

строка замещения может отсутствовать (пример 2);

директива может размещаться в любом месте текста программы, не обязательно в её начале, как мы писали в простейшем случае раньше. Действие команды распространяется от точки размещения до конца текста программы;

ранее определённый идентификатор можно затем использовать для определения других идентификаторов (пример 6).

Примеры.

1. На практике эта команда часто используется для определения “константы”. Например, в результате выполнения команды

#define n 10

каждое появление идентификатора n будет заменено числом 10.

2. Команда

#define obj

ничего не ставит в соответствие имени obj. Любое вхождение obj будет удалено. Можно использовать такой вид команды для условной компиляции (см. §3).

3. Пример расположения команды на двух строках:

#define Start for (int i=0; i<n; i++)\

for (int j=0; j<m; j++)

Если записать такую команду, то вместо двух подряд идущих вложенных циклов for можно просто записать Start.

4. Пусть задан следующий исходный текст программы:

#define begin {

#define end }

void main()

begin

операторы

end

В результате препроцессорной обработки begin заменится на левую фигурную скобку, а end — на правую. Получим

void main()

{

операторы

}

5 Имея определённый опыт программирования на другом языке (например, Pascal), можно забыть, что в ключевых словах языка С++ строчные и прописные буквы отличаются. Тогда можно записать, например, несколько директив компиляции такого рода:

#define FOR for

#define For for

Тогда не будет ошибки, если в тексте программы запишем FOR или For, так как препроцессор заменит их на for.

6. Если сначала определим

#define ONE 1,

то затем можно использовать ONE при определении другого идентификатора, например:

#define TWO ONE+ONE