11 · Процедуры и функции
Модификаторы PUBLIC и PRIVATE
Когда файл подключён к программе через IMPORT, не всякое его объявление должно становиться доступным снаружи. Модификатор перед объявлением решает, увидит ли импортирующий модуль это имя: PUBLIC открывает его, PRIVATE оставляет внутри файла. Ниже приведены отдельные формы разных объявлений, а не одна общая инструкция.
Где ставится модификатор
Модификатор записывается перед объявлением верхнего уровня. Отсутствие модификатора равнозначно PRIVATE. Он не меняет длительность хранения переменной, правила BYVAL/BYREF или захвата внешних значений. Вложенные функции и методы TYPE не получают отдельного модификатора доступности.
Процедура
PUBLIC SUB name(parameters)
statements
END SUBPRIVATE SUB name(parameters)
statements
END SUBФункция
PUBLIC FUNCTION name(parameters) AS resultType
statements
END FUNCTIONPRIVATE FUNCTION name(parameters) AS resultType
statements
END FUNCTIONТип
PUBLIC TYPE name
fields
END TYPEPRIVATE TYPE name
fields
END TYPEПеременная
PUBLIC DIM name AS dataType = initialValuePRIVATE DIM name AS dataType = initialValueКонстанта
PUBLIC CONST name AS dataType = valuePRIVATE CONST name AS dataType = valueПараметры и действие
name — имя объявления. parameters — обычный список параметров SUB или FUNCTION; resultType — тип результата функции. fields — объявления полей TYPE. dataType и начальные значения подчиняются правилам DIM и CONST. Модификатор не вводит новых типов или преобразований аргументов. Для других поддерживаемых форм DIM и CONST он также ставится перед соответствующим оператором.
PUBLIC делает объявление видимым после IMPORT своего модуля. PRIVATE не удаляет данные и не запрещает возврат записи или функционального значения из открытой функции.
Разницу показывает один файл: константа остаётся закрытой, а функция, которая ею пользуется, открыта.
PRIVATE CONST factor AS INTEGER = 2
PUBLIC FUNCTION Twice(value AS INTEGER) AS INTEGER
RETURN value * factor
END FUNCTION
PRINT Twice(3)Этот однофайловый пример печатает 6. При импорте файла доступна функция Twice, но не имя factor.
Правила и диагностика
Модификатор допустим только перед DIM, CONST, SUB, FUNCTION или TYPE верхнего уровня. Неверное расположение или отсутствие объявления даёт синтаксическую диагностику MB1001/MB1002. Внешнее обращение к закрытому имени даёт MB2053. Повторные объявления и конфликты имён сохраняют обычные диагностики MB2002, MB2016 и MB2055. PUBLIC CONST остаётся константой: передача в BYREF запрещена.