pragma semicolon 1 что это
Директива препроцессора #pragma.
и вам не составит труда понять суть данного урока.
#pragma отличается от остальных директив тем, что выполняет роль «маскировки» для ошибок компилятора. На практике встречается крайне редко, но иногда может быть полезна. Подчеркну: директива не устраняет допущенные в коде ошибки, а всего лишь скрывает их, для успешного выполнения компиляции.
Позволяет изменять границу стека и кучи.
Пример:
Использовать рекомендуется только в случае, если вы имеете переполнение. По возможности, избавляйтесь от чрезмерно больших массивов, типа:
Не выделяйте лишние ячейки, заведомо зная, что они не будут задействоваться.
Используется для установки размера отступов (табуляции).
По умолчанию значение директивы равно 4.
Изменять крайне не рекомендуется.
Если вы совсем хотите убрать табуляцию, используйте выставите значение для директивы равное данному:
Позволяет скрывать предупреждение №203.
На примере рассмотрим применение автоподсчёта для дальнейшего использования strcat.
Если вам лень считать занятые ячейки вручную, то вы наверняка применяете данную конструкцию:
В дальнейшем, мы не будет использовать константу, но и в тоже время назойливое предупреждение не будет нам мешать.
4. #pragma semicolon
Позволяет скрыть ошибку №001 и не использовать «;» после функции.
Пример:
В случае объявления в глобальной зоне видимости, будет распространяться на весь код.
5. #pragma deprecated
Генерирует предупреждение, если данный символ используется в коде.
Пример:
Сгенерируется предупреждение, что переменная gOldVariable больше не должна использоваться. Это в основном полезно для функций, требующих сохранения обратной совместимости при обновлении API.
Позволяет заменить символ ‘escape’ на любой другой.
Пример:
Позволяет включать/отключать информацию о предупреждениях.
Можно использовать в случае, если вы не знаете, как исправить тот или иной warning.
Общая форма записи:
Предупреждение 203 больше не будет вас беспокоить.
Также можно сохранять список выключенных предупреждений.
Общая форма записи:
8. #pragma amxlimit
Информация взята из статьи Y_Less’а.
Устанавливает максимальный размер в байтах, который может вместить скомпилированный скрипт. Эта мнемоника полезна для применения, когда у конечного файла крайне большой размер.
Парсер PAWN может преобразовывать символы в незапакованных строках и константах в юникод/UCS-4. Данная директива используется для указания кодовой страницы, которая должна быть преобразована.
Парсер PAWN может записывать сгенерированный Pawn-код в компактной или полной форме. Значение по-умолчанию зависит от настройки парсера. Данная директива разрешает скриптеру переопределять значение по-умолчанию в сторону полной формы кодирования(когда значение не равно нулю), либо наоборот, краткой(когда значение равно нулю). Данная директива полезна тем, что парсер PAWN не в состоянии сам перевести скрипт в компактный режим кодирования.
Важно: в SA-MP не поддерживается.
Если заданное значение равно нулю, упакованные строки объявляются знаком «!», а не запакованные двойными кавычками («»), без знака. Если значение равно единице, то литеральность строк объявляется в обратном порядке.
Обеспечивает удобство при работе с рациональными числами. Имя заданного тега может быть 2-х видов, либо Float:, либо Fixed:.
Указание тега является обязательным. Если он имеет вид Float:, то рациональное число записывается в виде «плавающей точки», а если нет, то в скалярной форме с указанием количества десятичных знаков.
Выравнивает последующую декларацию к смещению, заданному с помощью параметра компилятора. Некоторые (нативные) функции могут работать лучше с параметрами, которые передаются по ссылке, когда они находятся в границах 8, 16 или 32 байт. Требования к выравниванию зависят от ведущего приложения. Введя директиву #pragma align перед объявлением глобальной или статической переменной переменная выравнивается, и границы устанавливаются с помощью параметра компилятора. Обратите внимание, что директива #pragma align срабатывает только для переменной, которая следует сразу же за #pragma. Выравнивание последующих переменных зависит от размера переменных, которые предшествуют им. Например, если глобальная переменная массива из 2-х ячеек выравнена по 16-байтовой границе и ячейка занимает 4 байта, следующая глобальная переменная займёт уже 8 байт и так далее.
Ввод директивы #pragma align перед объявлением функции выравняет фрейм функции до указанных ранее границ, в результате чего первая локальная (не статическая) переменная будет чётко соответствовать этой границе. Выравнивание последующих переменных зависит от размера предшествующих переменных. На практике, чтобы выравнять локальную переменную, вы должны выравнять фрейм функции и объявить эту переменную перед любыми другими.
15. #pragma disablerecursion
Взято из библиотеки amx_assembly. Работает только для руссифицированного компилятора.
Позволяет отключить действующую рекурсию.
P.S. pragma, как и другие другие директивы, начинает работать ровно с того места, откуда была объявлена, и распространяется на весь последующий код. То бишь, если мы объявим, к примеру, #pragma semicolon локально, она будет работать для всего последующего кода, даже того, который находится в глобальной зоне видимости и располагается за пределами блока объявления.
Автор статьи: SooBad.
( с ) Копирование информации разрешено только с указанием всех авторов!
Урок 25. Работа со словарями
Практическая часть:
Для начала нам необходимо зарегистрировать наш файл словаря:
По умолчанию файл должен находиться в директории ./cstrike/addons/amxmodx/data/lang. В файле словаря (test_dictionary.txt) пишем текст следующего содержания:
[en]
TD_HELLO = Hello, world!
[ru]
TD_HELLO = Привет, мир!
Добавим функцию обработки команды /hello (вывода сообщения):
Мы получили простейшую функцию вывода сообщения ‘Hello, world!‘ или ‘Привет, мир!‘ (в зависимости от языковых настроек игрока-получателя сообщения) по команде /hello. Как вы, наверное, уже поняли, символы %L в сообщении заменяются на то значение, которое соответствует переменной TD_HELLO. Добавим в сообщение никнейм игрока, который вызывает эту функцию (выполняет команду /hello):
Теперь наше сообщение имеет вид: ‘Player: Hello, world!‘ или ‘Player: Привет, мир!‘. В данном случае мы использовали константу LANG_PLAYER (также можно использовать константу LANG_SERVER, либо индекс получателя, но об этом чуть позже). Обратите внимание, что константа LANG_PLAYER располагается всегда перед переменной TD_HELLO и между ними не должно быть никаких иных аргументов. То есть, подобные варианты:
ошибочны и, либо не будут работать вовсе, либо будут работать некорректно. Также для каждой переменной должна быть объявлена своя константа. Рассмотрим на конкретном примере. Добавим в файл словаря ещё одну переменную:
[en]
TD_HELLO = Hello, world!
TD_SAID = said
[ru]
TD_HELLO = Привет, мир!
TD_SAID = сказал
Добавим новую переменную в наше сообщение:
Теперь сообщение приняло следующий вид: ‘Hello, world! (said Player)‘ или ‘Привет, мир! (сказал Player)‘. С основной частью разобрались, переходим к деталям. Разберём, в каких случаях необходимо использовать константы LANG_PLAYER, LANG_SERVER и индекс получателя.
LANG_PLAYER необходимо использовать в тех случаях, когда индекс получателя заранее неизвестен. Например, при отправке сообщения всем игрокам, что мы и делали выше. Во всех остальных случаях желательно использовать индекс получателя. Рассмотрим пример. Добавим в словарь ещё одну переменную:
[en]
TD_HELLO = Hello, world!
TD_SAID = said
TD_HEALTH = Your health
[ru]
TD_HELLO = Привет, мир!
TD_SAID = сказал
TD_HEALTH = Ваше здоровье
Немного изменим наш код:
Теперь наше сообщение имеет вид: ‘Your health: 100‘ или ‘Ваше здоровье: 100‘. Как видите, вместо константы LANG_PLAYER перед переменной TD_HEALTH расположен индекс получателя, id, на языковые настройки которого и будет сориентирована система при отправке сообщения.
LANG_SERVER необходимо использовать в тех случаях, когда вы хотите, чтобы при отправке сообщения или его форматировании система была сориентирована на языковые настройки сервера. Также эту константу можно использовать в тех же случаях, что и LANG_PLAYER (то есть, если индекс получателя заранее неизвестен). На практике используется достаточно редко, но, иногда, бывает весьма полезной для решения нестандартных задач.
Важные детали:
Ну и последние детали, на которые следует обратить внимание. Как при составлении файла словаря правильно называть переменные. Я не случайно в начале каждой переменной указал префикс TD_ (первые буквы от названия плагина, ‘Test Dictionary‘). Переменные с одинаковыми именами могут «пересекаться» между собой, в результате чего мы можем наблюдать в сообщениях плагина совсем не тот текст, который указан в нашем файле словаря. Чтобы этого не случалось, нужно просто не допускать появления переменных с одинаковыми именами в разных файлах словаря.
Почти все программы на языке С++ используют специальные команды для компилятора, которые называются директивами. В общем случае директива – это указание компилятору языка С++ выполнить то или иное действие в момент компиляции программы. Существует строго определенный набор возможных директив, который включает в себя следующие определения:
#define, #include, #if, #endif, #error, #else, #undef, #tryinclude, #endinput.
#define
Эта директива заменяет себя на значение,удобно использовать для экономии памяти,например:
Так-же #define может содержать макросы,пример:
#if, #else, #elseif, #endif
С их помощью можно исключить из компиляции участки не нужного вам кода или сделать настройку скрипта через #define и #if, #else:
#error
Выдаёт ошибку при компиляции с указаным текстом.Удобно юзать при создании важной функции.
#undef
Удаляет директиву,пример:
#tryinclude
Так-же,как и #include,подгружает файл в скрипт,но если подгружаемый файл не существует,то директива просто просто пропустит этот файл,и не выведет ошибок,пример:
#endinput
Игнорирует весь ниже написанный код,пример:
#emit
Функция обращается к виртуальной машине, с помощью языка ASM(Assambler)
// Спасибо за информацию: ex.Jord
// Спасибо за информацию: velix
// Спасибо за информацию: velix
В результате получим Warn, который уведомляет о том, что функция\переменная устарела.
// Спасибо за информацию: velix
// Спасибо за информацию: velix
// Спасибо за информацию: velix
Данный пример отключает табуляцию.
// Спасибо за информацию: velix
// Спасибо за информацию: velix
// Спасибо за информацию: velix