Препроцессор Inno Setup: Пользовательские функции

В сценариях вы можете объявить и использовать пользовательские функции.

Объявление пользовательской функции состоит из списка формальных параметров и выражений, которые в совокупности представляют собой последовательность определённых операций, записанных пользователем. Результат всех этих операций вычисляется при каждом обращении к данной функции. Имена параметров, определённые в выражении функции, обрабатываются как обычные переменные.

Формальный синтаксис объявления пользовательских функций обеспечивается директивой define. В файле ISPPBuiltins.iss вы найдете множество примеров этих функций.

Пожалуйста, обратите внимание, что при записи между именем функции и круглой открывающей скобкой не должно быть пробела.

Фактические параметры, объявленные в качестве ссылок, должны быть изменяемыми l-значениями (другими словами, это значение, полученное при помощи одного или нескольких аргументов операции). Если выражение функции изменяет параметр передаваемый по ссылке, то переменная, которая передается в качестве этого параметра, также изменяется. По значению параметров можно также изменить выражение функции (используя операторы присваивания), но это изменение не влияет на значение переменной, которая передается в качестве параметра.

Хотя пользовательская функция может содержать только одно выражение, но операторы последовательной оценки (comma), операторы присваивания (простые и сложные), а также условные операторы (?:) могут использоваться для построения более сложных функций.

Локальный массив

В выражении функции допускается использовать дополнительный массив с именем Local. Его элементы могут быть задействованы в качестве временного хранения данных и повторного использования промежуточных значений выражения. Этот массив Local принадлежит только той функции, в которой он был вызван, и его данные недоступны за пределами самой функции, включая их сохранение.

Пример

#define DeleteToFirstPeriod(str *S) /* объявление пользовательской функции */ \
Local[1] = Copy(S, 1, (Local[0] = Pos(".", S)) - 1), \
S = Copy(S, Local[0] + 1), \
Local[1]