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

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

    Я сам программирую на PAWN. И знал почти про все, кроме #endinput и #error. Продолжай писать мануалы про PAWN интересно будет новичкам и не только. Молодец :D

Перейти к верхней панели