Язык программирования C++ для профессионалов


Макросредства


В С++ макросредства играют гораздо меньшую роль, чем в С. Можно даже дать такой совет: используйте макроопределения только тогда, когда не можете без них обойтись. Вообще говоря, считается, что практически каждое появление макроимени является свидетельством некоторых недостатков языка, программы или программиста. Макросредства создают определенные трудности для работы служебных системных программ, поскольку они перерабатывают программный текст еще до трансляции. Поэтому, если ваша программа использует макросредства, то сервис, предоставляемый такими программами, как отладчик, профилировщик, программа перекрестных ссылок, будет для нее неполным. Если все-таки вы решите использовать макрокоманды, то вначале тщательно изучите описание препроцессора С++ в вашем справочном руководстве и не старайтесь быть слишком умным.

Простое макроопределение имеет вид:

#define имя остаток-строки

В тексте программы лексема имя заменяется на остаток-строки. Например,

объект = имя

будет заменено на

объект = остаток-строки

Макроопределение может иметь параметры. Например:

#define mac(a,b) argument1: a argument2: b

В макровызове mac должны быть заданы две строки, представляющие параметры. При подстановке они заменят a и b в макроопределении mac(). Поэтому строка

expanded = mac(foo bar, yuk yuk)

при подстановке преобразуется в

expanded = argument1: foo bar argument2: yuk yuk

Макроимена нельзя перегружать. Рекурсивные макровызовы ставят перед препроцессором слишком сложную задачу:

// ошибка: #define print(a,b) cout<<(a)<<(b) #define print(a,b,c) cout<<(a)<<(b)<<(c)

// слишком сложно: #define fac(n) (n>1) ?n*fac(n-1) :1

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

Допустимы такие макроопределения:




Начало  Назад  Вперед



Книжный магазин