Pawn. Директивы препроцессора

2 минут

Директивы указывают компилятору как нужно компилировать скрипт. В 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, #endi🔗︎

Директивы #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