Что произойдет, если в разных исходных файлах будут объявлены переменные с одним и тем же именем х
? Решать этот вопрос предстоит линковщику, опираясь на правила по умолчанию и "подсказки", которые даст разработчик. Возможно, тот просто не знал, что имя уже используется, и нужно трактовать эти переменные как различные. Или, напротив, разработчик имел в виду одну и ту же переменную, и нужно позаботиться, чтобы все ссылки на х
указывали на одну область памяти. Эти два варианта решения соотвествуют двум типам линковки.
Внешняя линковка (external linkage) означает, что одинаковые имена, используемые в разных файлах, трактуются линковщиком как один объект. Для имен функций и переменных, объявленных вне функций, внешняя линковка применяется по умолчанию.
Внутренняя линковка (internal linkage) для переменной x
или функции f()
из файла a.c
означает, что указанные объекты является "собственностью" этого файла, а переменные или функции с такими же именами, но объявленные в других файлах, являются другими объектами.
Интересно, что для обозначения внешней линковки используется ключевое слово extern
, тогда как для внутренней особого ключевого слова (например, intern
) нет. Вместо этого используется ключевое слово static
. Это может вызвать путаницу.
Дело в том, что static
уже используется для указания модели памяти, в данном случае — статической. Статические переменные инициализируются до начала выполнения функции main()
, а их время жизни совпадает со временем выполнения программы. Поэтому нужно различать, когда static
используется для указания типа линковки, а когда — модели памяти.
- Для переменных, областью действия которых является файл,
static
указывает только на тип линковки:- любая переменная
x
, объявленная вне функции, размещается в памяти по статической модели, независимо от того, объявлена она какstatic int x
,extern int x
или просто какint x
; - в данном случае по умолчанию используется внешняя линковка, поэтому использование
static
изменяет тип линковки на внутреннюю.
- любая переменная
- Для переменных, областью действия которых является блок,
static
влияет только на модель памяти:- указание
static
на линковку не влияет, поскольку по умолчанию для таких переменных итак используется внутренняя линковка; - переменные, определенные в блоке, по умолчанию являются автоматическими, поэтому указание ключевого слова
static
изменит эту модель памяти на статическую.
- указание
- Для функций
static
влияет только на тип линковки:- областью действия функций всегда является файл, поэтому, как и для всех объектов с такой областью действия, для функций по умолчанию используется внешняя линковка.
static
изменяет это умолчание; - здесь нет пересечений с моделью памяти; в этом смысле функции всегда являются статическими, поскольку их областью действия является файл.
- областью действия функций всегда является файл, поэтому, как и для всех объектов с такой областью действия, для функций по умолчанию используется внешняя линковка.
Комментарии
comments powered by Disqus