PureBasic

Макросы

Краткое описание функций:
Macro/EndMacro UndefineMacro MacroExpandedCount

Синтаксис
Macro <name> [(Parameter [, ...])]
  ...
EndMacro 

Описание


Макросы - очень мощная функция, главным образом полезная для опытных программистов. Macros - это метка-заполнитель для небольшого кода (ключевое слово, строка или несколько строк), который вставляется (при компилировании) непосредственно в программный код, где макрокоманда вызывается. В этом она отличается от процедур, поскольку процедуры не копируют код, когда их вызывают.

Объявление Macro : EndMacro должно быть сделано до первого вызова макроса. Так как макросы будут полностью заменены соответствующим кодом, во время компиляции.

Macros не может иметь по возвращению тип или параметры соответствующие образцу, так как это не имеет смысла. Если у макрокоманды есть параметры, они заменяются в коде на копию, переданную при вызове макроса. Очень важно понять: оценка строки начинается только тогда, когда будут обработаны все найденные в этой строке макросы.

Макросы разделены на две категории: простые (без параметров) и комплексные (с параметрами, при их вызове необходимо использовать скобки). Когда параметр не указан, возможно заменять любое слово, другим словом (или другим выражением). Макросы могут использоваться рекурсивным образом, однако если один из передаваемых параметров содержит #, он не будет работать.

Пример: Простой Макрос

Macro MyNot
    Not
EndMacro

a = 0
If MyNot a  ; Здесь строка будет расширена следующим образом:  'If Not a'
    Debug "Ok"
EndIf

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

Пример: Макрос с параметром

Macro UMsgBox(Title, Body)
    MessageRequester(Title, UCase(Body), 0)
EndMacro

Text$ = "World"
UMsgBox("Hello", "-"+Text$+"-") ; Здесь строка будет расширена следующим образом:
                                ; 'MessageRequester("Hello", UCase("-"+Text$+"-"), 0)'

Пример: Макрос с параметром по умолчанию

Macro UMsgBox(Title, Body = "Ha, no body specified")
    MessageRequester(Title, UCase(Body), 0)
EndMacro

UMsgBox("Hello") ; Здесь строка будет расширена следующим образом:
                ; 'MessageRequester("Hello", UCase("Ha, no body specified"), 0)'

Пример: Конкатенация Макросов

Macro XCase(Type, Text)
    Type#Case(Text)
EndMacro

Debug XCase(U, "Hello")
Debug XCase(L, "Hello")

Пример: Сложный многострочный Макрос

Macro DoubleQuote
    "
EndMacro

Macro Assert(Expression)
    CompilerIf #PB_Compiler_Debugger  ; Только включите, утверждают в режиме отладки
        If Expression
            Debug "Assert (Line " + #PB_Compiler_Line + "): " + DoubleQuote#Expression#DoubleQuote
        EndIf
    CompilerEndIf
EndMacro

Assert(10 <> 10) ; Ничего не выведет на экран
Assert(10 <> 15) ; Должен вывести на экран утверждение




Синтаксис
UndefineMacro <name>

Описание


UndefineMacro позволяет отменить ранее определенный макрос и переопределить его другим способом. Как только макросу отменили определение, он становится недоступен для использования.

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

Macro Test
    Debug "1"
EndMacro

Test ; вызов макроса

UndefineMacro Test ; Отмена определения макроса, он больше не существует

Macro Test ; Теперь мы можем переопределить макрос
    Debug "2"
EndMacro

Test ; вызов макроса




Синтаксис
MacroExpandedCount

Описание


MacroExpandedCount позволяет получать расширенную информацию о макросе (число вызовов, макрос был расширен/назван). Может быть полезно для генерации уникальных идентификаторов в том же макросе для каждого вызова (как метка, имя процедуры и т.д.).

Пример: Расширенный счетчик

Macro Test
    Debug MacroExpandedCount
EndMacro

Test ; Вызов макроса
Test ; Вызов макроса
Test ; Вызов макроса