В языках программирования, особенно в компилируемых, таких как C , C++ и D , связывание описывает, как имена могут или не могут ссылаться на одну и ту же сущность во всей программе или в одной отдельной единице трансляции .
Ключевое static
слово используется в C для ограничения видимости функции или переменной ее единицей трансляции. Это также допустимо в C++. (C++ 98/03 устарело в пользу анонимных пространств имен , но больше не устарело в C++ 11.) Кроме того, C++ неявно рассматривает любую const
переменную области пространства имен как имеющую внутреннюю связь, если она явно не объявлена extern
, в отличие от C.
Ссылка имени связана с его областью действия , но отличается от нее . Область действия имени — это часть единицы перевода, где оно видимо. Например, имя с глобальной областью действия (которая совпадает с областью действия файла в C и совпадает с глобальной областью действия пространства имен в C++) видимо в любой части файла. Его область действия закончится в конце единицы перевода, независимо от того, была ли этому имени задана внешняя или внутренняя связь.
Если имя имеет внешнюю связь, на сущность, которую обозначает имя, можно ссылаться из другой единицы трансляции, используя отдельную декларацию для того же имени, и из других областей в пределах той же единицы трансляции, используя отдельную декларацию. Если бы имя имело внутреннюю связь, такое объявление обозначало бы отдельную сущность, хотя и используя то же имя, но на ее сущность можно было бы ссылаться с помощью отдельных деклараций в пределах той же единицы трансляции. На имя, которое вообще не имеет связи, нельзя ссылаться из деклараций в разных областях, даже из той же единицы трансляции. Примерами таких имен являются параметры функций и локальные переменные. Детали различаются между C (где связь имеют только объекты и функции, но не типы) и C++, а также между этим упрощенным обзором.
Связывание между языками должно осуществляться с некоторой осторожностью, поскольку разные языки по-разному украшают свои внешние символы. Распространенная идиома использует extern "C"
для связывания кода C++ и C.
Определение «связь» взято из ISO/IEC 9899:TC3 (стандарт C99). В языке C используется термин «идентификатор», тогда как в этой статье используется «имя» (последнее из которых используется в C++ для формализации связи):
Идентификатор, объявленный в разных областях или в одной и той же области более одного раза, можно заставить ссылаться на один и тот же объект или функцию с помощью процесса, называемого связыванием. [1]
Ниже приведен типичный пример связи:
/* файл demo1.c */ /* extern */ void foo ( void ); /* extern необязательно - это значение по умолчанию */ int main ( void ) { foo (); return 0 ; }
/* файл demo2.c */ void foo ( void ) { ... }
Функция foo
объявлена в двух файлах, при этом ее тело функции определено в demo2.c
. Через связывание, foo
вызванное main()
внутри demo1.c
ссылается на foo
в demo2.c
. Это пример внешнего связывания для функции.