Директивы указывают компилятору как нужно компилировать скрипт. В Pawn директивы похожи на директивы C++, они тоже являются директивами препроцессора и имеют схожий синтаксис. Ещё директивы препроцессора нужны для обеспечения удобства над работой скрипта и оптимизации работы мода. В данной статье будет рассказано не о всех существующих директивах, т.к. для рядовых скриптеров они не понадобятся.
#include
Директива #include подключает файл в скрипт. С её помощью можно хорошо и удобно структуризовать скрипт. Если указаного файла не будет, компилятор ругнётся. Если расширение не указать, то по умолчанию идёт расширение .inc, расширение может быть любым.
Использование:
#include "filename.lol" // подключит файл из папки с компилируемым скриптом
#tryinclude
Директива #tryinclude также как и #include подключает файл в скрипт. Они имеют одинаковое действие, но различие в том, что если подключаемый файл не найден, то компилятор пропустит эту директиву и не будет выдавать ошибок.
Использование:
#tryinclude "filename.lol" // подключит файл из папки с компилируемым скриптом
#define
Директива #define как-бы заменяет себя на указанное значение. Очень удобно использовать для экономии памяти.
Использование:
#define HW_MSG "Hello World" // в процессе компиляции меняет HW_MSG на "Hello World" main() { print(HW_MSG); }
#define SendMSG(%0,%1) SendClientMessage(%0,0x331166FF,%1) // зададим с параметрами %0 и %1 main() { SendMSG(0,"Hello World!"); // в процессе компиляции заменится на SendClientMessage(0,0x331166FF,"Hello World!"); }
#undef
Директива обратная #define. Как можно догадаться, она ‘раздефайневает'(удаляет), директиву.
Использование:
#define HW_MSG // 'задефайним' HW_MSG #undef HW_MSG // 'раздефайним' HW_MSG main() { #if defined HW_MSG // если HW_MSG задефайнен print("HW_MSG is defined!"); // будет выбрано в итоге #elseif print("HW_MSG is not defined!"); #endif }
#if, #elseif, #else, #endif
Директивы #if, #elseif, #else и #endif это обычные условия, но выполняемые препроцессором. С их помощью можно исключить из компиляции участки не нужного вам кода или сделать настройку скрипта через #define и #if, #else.
Использование:
#define HW_MSG // 'задефайним' HW_MSG main() { #if defined HW_MSG // если HW_MSG задефайнен print("HW_MSG is defined!"); // будет выбрано в итоге #elseif print("HW_MSG is not defined!"); #endif }
//#define HW_MSG // не будем дефайнить HW_MSG main() { #if !defined HW_MSG // если HW_MSG НЕ задефайнен print("HW_MSG is not defined!"); // будет выбрано в итоге #elseif print("HW_MSG is defined!"); #endif }
#error
Выдаёт ошибку компиляции с указанным текстом. Она обычно используется в модульных скриптах, для увеличения скорости компиляции при нахождении недостающих функций.
Использование:
#if !defined strtok // если функция strtok не задефайнена #error strtok not found in script! // выдаст 'strtok not found in script!' при выполнении условия #endif
#endinput
Если компилятор встречает #endinput в файле, то он игнорирует весь ниженаписанный код.
Использование:
#if defined USE_THIS #endinput #endif