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