ADOLF

WarCraft 3: 6.Препроцессор

cJass

6.1 Подключение внешних файлов

Иногда удобно держать отдельные части кода во внешних файлах — часто используемые библиотеки, системы и заклинания, созданные другими, и прочее. Для включения в карту кода из внешних файлов в синтаксисе cJass существует директива include, после которой должна следовать строка с именем подключаемого файла. Файлы с кодом, подключаемые этой директивой, могут находиться в подпапке "lib" папки с парсером AdicHelper или в папке с картой — тогда можно передавать путь относительно этих папок. Также можно подключать файлы из любых других папок, но при этом нужно указывать полный путь к ним.
  include "myClasses.j"   // будет подключен файл "AdicHelper\lib\myClasses.j"
  include "D:\\dev\\Warcraft 3\\my_mega_system.j"
Код, подключаемый с помощью этой директивы, может быть написан с использованием синтаксиса cJass и vJass.
Внимание! Не забывайте, что обратный слэш в строках нужно экранировать: \\
Иногда возникает ситуация, при которой один и тот же внешний файл включается в карту несколько раз, например, разными библиотеками. В таком случае возникнут неизбежные ошибки из-за повторения кода, чего хотелось бы избежать. Для этого в cJass существует директива #guard идентификатор, которая предотвращает повторное подключение внешних файлов с одинаковыми идентификаторами. В качестве идентификаторов может выступать любое слово, но принято использовать для этого имя файла, в котором все недопустимые символы (например, точки) заменены на знаки подчёркивания. К примеру, во внешнем файле "my-system.j" идентификатор может быть таким: #guard my_system_j.
Внимание! Директива #guard должна стоять в самом начале подключаемого файла.

6.2 Условная трансляция

Синтаксис cJass вводит в язык полезные команды условной трансляции. С помощью этих команд части кода могут быть включены или исключены из карты на стадии трансляции. Управляющими элементами в командах условной трансляции могут быть значения, макросы или перечисления (См. 7). Синтаксис этих команд следующий:
  define CONTROL = 3
  
  #if CONTROL == 3
      // code
  #elseif CONTROL == 1
      // alternative code
  #else
      // another code
  #endif
На данный момент в командах #if и #elseif возможно использование только операций сравнения == и !=
В блоках условной трансляции можно писать любой код с одним ограничением: в них не должны определяться макросы с одинаковыми именами:
  #if 1 != 0
      define msg = "hello!"
  #else
      define msg = "good bye!"
  #endif
При попытке сохранить данный код транслятор выдаст ошибку повторного объявления макроса. Если вы хотите использовать код, аналогичный приведенному выше, то нужные макросы стоит объявить до блока условной трансляции, а в самом блоке просто назначить этим макросам значения с помощью директивы setdef:
  define msg
  
  #if 1 != 0
      setdef msg = "hello!"
  #else
      setdef msg = "good bye!"
  #endif
Директивы условной трансляции также могут срабатывать при определенном состоянии флага — им выступает особого вида макроопределение.
  define FLAG = true
  
  #if FLAG
      // code
  #else
      // alternative code
  #endif
Директива #if value сработает только если сравниваемое макроопределение имеет значение true или 1.

6.3 Другие директивы

В некоторых случаях возникает необходимость остановить компиляцию и выдать пользователю ошибку: например, если не выполнено какое-то требование библиотеки. Тогда на помощь придёт директива #error "MSG", которая остановит компиляцию с этим сообщением. Выгодно использовать внутри блоков условной компиляции.

Просмотров: 400

Комментарии пока отсутcтвуют