В результате её обработки все вхождения определённого в команде идентификатора в тексте программы, начиная с этой команды, заменяются записанной последовательностью символов. Идентификатор называют ещё макроопределением или макросом.
Правила записи директивы 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 при определении другого идентификатора, например: