Программа состоит из одного или нескольких файлов, связываемых вместе($$R.2). Файл состоит из последовательности описаний. Имя с файловой областью видимости, которое явно описано какstatic, является локальным в своей единице трансляции и можетиспользоваться для именования объектов, функций и т.п. в другихединицах трансляции. Говорят, что такие имена имеют внутреннеесвязывание. Имя с файловой областью видимости, которое явно описаносо спецификацией inline, является локальным в своей единицетрансляции. Имя с файловой областью видимости, которое явно описаносо спецификацией const и не описано явно как extern, считаетсялокальным в своей единице трансляции. То же верно для имени класса,которое не использовалось в нелокальных для данной единицытрансляции описаниях объекта, функции или класса, и который неимеет статических членов ($$R.9.4), не имеет функций-членов, кромеподстановок ($$R.9.3.2). Всякое описание некоторого имени сфайловой областью видимости, которое не описано одним из перечисленныхспособов так, чтобы иметь внутреннее связывание, в многофайловойпрограмме обозначает один и тот же объект ($$R.3.7), функцию($$R.8.2.5) или класс ($$R.9). Такие имена называются внешними илиговорят, что они имеют внешнее связывание. В частности, посколькунельзя описать имя класса как static, всякое употребление именинекоторого класса с файловой областью видимости, который (класс)использовался для описания объекта или функции с внешним связыванием,или же который имеет статический член или функцию-член,не являющуюся подстановкой, будет обозначать один и тот же класс. Имена определяемых типов (typedef $$R.7.13), элементы перечисления($$R.7.2) или имена шаблонов типа ($$R.14) не имеют внешнегосвязывания. Статические члены класса ($$R.9.4) допускают внешнее связывание. Функции-члены, не являющиеся подстановкой, допускают внешнеесвязывание. Функции-члены, являющиеся подстановкой, должны иметьв точности одно определение в программе. Локальные имена ($$R.3.2), явно описанные со спецификациейextern, имеют внешнее связывание, если только они уже не былиописаны как static ($$R.7.1.1). Типы, используемые во всех описаниях некоторого внешнего имени,должны совпадать, за исключением использования имен определяемыхтипов ($$R.7.1.3) и указания границ массивов ($$R.8.2.4).Должно быть в точности одно определение для каждой функции, объекта,класса и элемента перечисления, используемых в программе. Однако,если функция никогда не вызывается и ее адрес никогда не используется,ее не нужно определять. Аналогично, если имя класса используетсятолько таким образом, что не требуется знать определение класса,то класс не нужно определять. Область видимости функции может быть только файл или класс. С помощью спецификации связывания можно добиться связывания сописаниями на другом языке ($$R.7.4).