Область видимости обозначает область программы, в пределах которой идентификатор (имя) некоторой переменной продолжает быть связанным с этой переменной и возвращать её значение. За пределами области видимости тот же самый идентификатор может быть связан с другой переменной, либо быть свободным (не связанным ни с какой из них). В сценариях 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. Если же она заявлена в одном из файлов подключенных через стек (т.е. один из файлов подключенного директивой include, которая в процессе обработки приводит к объявленному файлу), то её идентификатор относится к общедоступной (public) области видимости переменной MyVar.
Таким образом, если в показанном примере поменять местами две последние записи объявления переменных, то закрытая (private) переменная MyVar станет недоступной (до момента отмены объявления защищенной переменной) потому, что защищенная (protected) переменная объявлена после него и имеет больший приоритет. Но это не сможет отменить копию закрытой (private) переменной.
В каждом файле можно задать область видимости переменных по умолчанию, которая будет использована для тех переменных, у которых она явно не указана. Это делается при помощи директивы define, например:
#define protected
Здесь мы объявили защищенную (protected) область видимости по умолчанию.
Установленная область видимости переменных не распространяется на выражения и предназначена только для установки области видимости для тех переменных, у которых она явно не указана. Если область видимости по умолчанию не установлена, то по умолчанию предполагается общедоступная (public). Установка области видимости не распространяется на подключенные или родительские файлы.
В выражениях пользовательских функций старайтесь не использовать идентификаторы с более низкой областью видимости, чем вне функции. Это может стать причиной появления ошибок "Undeclared identifier" (неизвестный идентификатор), если функция будет вызвана из другого файла.
При объявлении переменных рекомендуется использовать соответствующую область видимости, что избежать проблем с неожиданным переопределением переменной (например, при подключении файла стороннего разработчика). Если в подключенных файлах переменная не используется, объявите её как закрытую (private). Если используется, в родительском файле нет, объявите её как защищенную (protected). В остальных случаях используйте общедоступные (public). Если вы не уверены, то в большинстве случаев можете указывать защищенную (protected) область видимости.