Линковка переменной и процедуры
 
Видимость имен внутри и между модулями

Линковка определяет видимость имени переменной, объекта или процедуры между одним или несколькими модулями программы. Другими словами, линковка определяет, как имя разделяется между модулями. Есть два основных типа линковки, в результате которой имя может иметь: внутреннее и внешнее.

Внутренняя линковка


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

Декларация модульной области видимости


Имена переменных и объектов, объявленные в области модуля имеют внутреннее связывание если они не объявлены с помощью с Extern или Common. Например, имена переменных объявленные с помощью с Dim или Static имеют внутреннюю связь, и эти переменные могут быть отнесены по имени только в модуле, в котором они определены. Обратите внимание, что использование Shared позволяет только видимость имен в пределах процедур модуля, и не способствует линковке имен.

Имя процедур, объявленное с помощью Private имеет внутреннюю линковку.

Декларация локальной области видимости


Все имена переменных и объектов, объявленные в локальной области (в цикле Do, или теле процедуры, например) имеют внутреннюю линковку.

Внешняя линковка


Имена с внешней линковкой могут ссылаться на переменные, объекты или процедуры, определенные в их модуле или в другом модуле. Внешняя линковка означает, что имена внешне видимы для других модулей, и все внешние имена, которые используют модули,  относятся к тем же переменным, объектам или процедурам. Таким образом только один модуль может определять внешнее имя (компилятор будет жаловаться на дублированные определения, если он найдет дополнительное определение имени с внешней линковкой).

Декларация модульной области видимости


Имена переменных и объектов, объявленные в области модуля имеют внешнюю линковку, а объявляются Extern или Common.

Extern декларирует переменную, имеющую внешнюю линковку, но не определяет переменную. Эта внешняя декларация должна находиться перед любым определением с тем же именем (декларация без Extern указывает внутреннюю связь, и в настоящее время, любые дополнительные внешние объявления этого имени означают дублированные определения). Имена переменных и объектов с внешней линковкой, декларированные с помощью Extern , всегда в общей области и поэтому могут быть переданы в рамках процедуры.

Common декларирует переменную с внешней линковкой, а также определяет ее. Но в отличии от Extern , определение переменной может появиться более чем в одном модуле. При использовании с массивами, только массивы переменной длины без индексов могут быть продекларированы, а размер массива указывается во время выполнения с помощью Dim или ReDim, прежде чем массив может быть использован. Имена переменных и объектов с внешней линковкой, объявленные с использованием Common находятся в общей области если указан спецификатор Shared. Shared переменные могут быть переданы в рамках процедуры.

Когда Extern и Common используются вместе в одном модуле для декларации и определения одной переменной, эффект будет такой же, как вместо Common будет Dim. Как правило, не рекомендуется смешивать Extern и Common на ту же переменную в одном модуле. Однако переменные могут быть продекларированы и определены в одном модуле с Common , а затем к ним может быть обращение с Extern в другом модуле без путаницы.

Продекларированные имена процедур имеют внешнюю линковку по умолчанию. Объявления с помощью Public явно указывают внешнюю линковку.

Декларация локальной области видимости


В настоящее время имена, объявленные в локальной области не могут иметь внешнюю линковку.