#define
 
Директива препроцессора для определения макроса

Синтаксис

#define identifier body
#define identifier( [ parameters ] ) body
#define identifier( [ parameters, ] Variadic_Parameter... ) body

Описание

#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 является типобезопасной альтернативой.

Пример

'' Определение и проверка
#define DEBUGGING
#ifdef DEBUGGING
  ' ... заявления
#endif

'' Простое определение
#define FALSE 0
#define TRUE (Not FALSE)

'' Функция-подобное определение
#define MyRGB(R,G,B) (((R)Shl 16)  Or ((G)Shl 8) Or (B)) 
Print Hex( MyRGB(&hff, &h00, &hff) )

'' Продолжение строки и заявления в определении
#define printval(bar) _
    Print #bar; " ="; bar

'' #defines видны только в области, где они определены
Scope
    #define LOCALDEF 1
End Scope

#ifndef LOCALDEF
#    Print LOCALDEF Is Not defined
#endif

'' пространства имен не влияют на видимость определения
Namespace foo
#    define NSDEF
End Namespace

#ifdef NSDEF
#    Print NSDEF Is defined
#endif


Отличия от QB

  • Новое в FreeBASIC

См. также