Область видимости обозначает область программы, в пределах которой идентификатор (имя) некоторой переменной продолжает быть связанным с этой переменной и возвращать её значение. За пределами области видимости тот же самый идентификатор может быть связан с другой переменной, либо быть свободным (не связанным ни с какой из них). В сценариях Inno Setup переменные могут быть определены в одной из трех специфических областей видимости: общедоступные (public), защищенные (protected) или закрытые (private). При объявлении такой переменной, её область видимости указывается ключевым словом после директивы define. Посмотрите на следующие примеры:
; Объявляем общедоступную переменную с именем MyVar и присваиваем ей значение 12 #define public MyVar 12 ; Объявляем защищенную переменную с именем MyVar и присваиваем ей значение 13 #define protected MyVar 13 ; Объявляем закрытую переменную с именем MyVar и присваиваем ей значение 14 #define private MyVar 14
В приведенном выше примере, ни одно из последующих объявлений переменной не переопределяет предыдущее, хотя используется один и тот же идентификатор (MyVar). Причиной этого является различная область видимости заявленная для переменных.
Общедоступные (public) — это простые переменные, которые доступны из любого места после того, как были объявлены.
Защищенные (protected) — это переменные, которые доступны только в том файле, в котором они были объявлены, а также во всех файлах, подключенных при помощи директивы include или file. Защищенные переменные можно рассматривать как общедоступные переменные, которые автоматически теряют значение после завершения работы файла.
Закрытые (private) — это переменные, которые доступны только в том файле, в котором были объявлены. Область их действия не распространяется на другие файлы, будь то подключенные или родительские (parent) файлы.
В ISPP отсутствует механизм сохранения и восстановления значения переменной (добавление в стек и извлечение из него), поэтому определение области видимости может оказаться полезным.
Обратите внимание, что в выражениях нельзя обращаться к переменной с определённой областью видимости. С учётом вышеприведенного примера, если MyVar заявлена в выражении объявленного файла, то её идентификатор относится к закрытой (private) области видимости переменной MyVar. Если она заявлена в подключенном файле, то её идентификатор относится к защищенной (protected) области видимости переменной MyVar. Если же она заявлена в одном из файлов подключенных через стек (т.е. в одном из файлов, которые прямо или косвенно приводят к объявленному файлу), то её идентификатор относится к общедоступной (public) области видимости переменной MyVar.
Таким образом, если в показанном примере поменять местами две последние записи объявления переменных, то закрытая (private) переменная MyVar станет недоступной (до момента отмены объявления защищенной переменной) потому, что защищенная (protected) переменная объявлена после него и имеет больший приоритет. Но это не сможет отменить копию закрытой (private) переменной.
В каждом файле можно задать область видимости переменных по умолчанию, которая будет использована для тех переменных, у которых она явно не указана. Это делается при помощи директивы define, например:
#define protected
Здесь мы объявили защищенную (protected) область видимости по умолчанию.
Установленная область видимости переменных не распространяется на выражения и предназначена только для установки области видимости для тех переменных, у которых она явно не указана. Если область видимости по умолчанию не установлена, то по умолчанию предполагается общедоступная (public). Установка области видимости не распространяется на подключенные или родительские файлы.
В выражениях пользовательских функций старайтесь не использовать идентификаторы с более низкой областью видимости, чем вне функции. Это может стать причиной появления ошибок "Undeclared identifier" (неизвестный идентификатор), если функция будет вызвана из другого файла.
При объявлении переменных рекомендуется использовать соответствующую область видимости, что избежать проблем с неожиданным переопределением переменной (например, при подключении файла стороннего разработчика). Если в подключенных файлах переменная не используется, объявите её как закрытую (private). Если используется, а в родительском файле — нет, объявите её как защищенную (protected). В остальных случаях используйте общедоступные (public). Если вы не уверены, то в большинстве случаев можете указывать защищенную (protected) область видимости, что является безопасным выбором.