Date Редакция Категория comp Теги C

Что произойдет, если в разных исходных файлах будут объявлены переменные с одним и тем же именем х? Решать этот вопрос предстоит линковщику, опираясь на правила по умолчанию и "подсказки", которые даст разработчик. Возможно, тот просто не знал, что имя уже используется, и нужно трактовать эти переменные как различные. Или, напротив, разработчик имел в виду одну и ту же переменную, и нужно позаботиться, чтобы все ссылки на х указывали на одну область памяти. Эти два варианта решения соотвествуют двум типам линковки.

Внешняя линковка (external linkage) означает, что одинаковые имена, используемые в разных файлах, трактуются линковщиком как один объект. Для имен функций и переменных, объявленных вне функций, внешняя линковка применяется по умолчанию.

Внутренняя линковка (internal linkage) для переменной x или функции f() из файла a.c означает, что указанные объекты является "собственностью" этого файла, а переменные или функции с такими же именами, но объявленные в других файлах, являются другими объектами.

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

Дело в том, что static уже используется для указания модели памяти, в данном случае — статической. Статические переменные инициализируются до начала выполнения функции main(), а их время жизни совпадает со временем выполнения программы. Поэтому нужно различать, когда static используется для указания типа линковки, а когда — модели памяти.

  1. Для переменных, областью действия которых является файл, static указывает только на тип линковки:
    • любая переменная x, объявленная вне функции, размещается в памяти по статической модели, независимо от того, объявлена она как static int x, extern int x или просто как int x;
    • в данном случае по умолчанию используется внешняя линковка, поэтому использование static изменяет тип линковки на внутреннюю.
  2. Для переменных, областью действия которых является блок, static влияет только на модель памяти:
    • указание static на линковку не влияет, поскольку по умолчанию для таких переменных итак используется внутренняя линковка;
    • переменные, определенные в блоке, по умолчанию являются автоматическими, поэтому указание ключевого слова static изменит эту модель памяти на статическую.
  3. Для функций static влияет только на тип линковки:
    • областью действия функций всегда является файл, поэтому, как и для всех объектов с такой областью действия, для функций по умолчанию используется внешняя линковка. static изменяет это умолчание;
    • здесь нет пересечений с моделью памяти; в этом смысле функции всегда являются статическими, поскольку их областью действия является файл.


Комментарии

comments powered by Disqus