#define позволяет объявить текстовые макрокоманды препроцессора.
После того, как компилятор встретил
#define, он начнет
заменять дальнейшие вхождения
identifier на
body.
body
может быть пустым. Расширение происходит рекурсивно пока возможно и после
этого компилятор может продолжить анализ полученного кода.
#undef
может быть использован для отмены макроса, созданного с помощью
#define.
Parameters превращают определение в функция-подобный макрос,
позволяя передавать текстовые аргументы в макрос. Любые вхождения имен
параметров в
body будут заменены на данный текстовый
аргумент при расширении. Оператор
#
преобразование аргументов макроса в строку может быть использован
для макропараметров, чтобы превратить их в строковые литералы, а оператор
##
Конкатенация может быть использован для объединения маркеров
вместе.
Примечание: В функция-подобном макросе,
identifier должен
сопровождаться открытием скобок (
() без пробела между скобкой
и
identifier, в противном случае компилятор будет
рассматривать его как часть
body.
Определения различают области видимости; они видны только в той области
видимости, в которой они были определены. Если определяется на уровне
модуля, определения видны на протяжении всего модуля. Если
identifier
определяется внутри составного оператора, имеющего свою область видимости (
Sub,
For..Next,
While..Wend,
Do..Loop,
Scope..End Scope,
и др.), определение
identifier виден только внутри данной
области. Пространства имен не оказывает никакого влияния на видимость
определений.
Identifiers могут быть проверены с помощью
#ifdef
и других условных директив, которые могут быть использованы, чтобы скрыть
части кода от компилятора (условная компиляция).
Результаты макроподстановки можно проверить с помощью опции компилятора
-pp.
#define часто используется для объявления констант. Заявление
Const является типобезопасной
альтернативой.
См. также