Функция: Метки (§R.6.1) можно использовать повсюду в функции, в которой они описаны. Только метки имеют область видимости, совпадающую с функцией.
Файл: Имя описанное вне всех блоков (§R.6.3) и классов (§R.9) имеет область видимости файл и может быть использовано в единице трансляции, в которой оно появляется после момента описания. Имена, описанные с файловой областью видимости, называются глобальными.
Класс: Имя члена класса является локальным в своем классе и оно может быть использовано только в функции-члене этого класса (§R.9.3), или после операции., применяемой к объекту данного класса (§R.5.2.4) или объекту производного класса(§R.10), или после операции -›, применяемой к указателю на объект данного класса (§R.5.2.4) или на объект производного класса, или после операции разрешения:: (§R.5.1), примененной к имени данного или производного класса. Имя, введенное с помощью операции friend (§R.11.4), принадлежит той же области определенности, что и класс, содержащий описание friend. Класс, впервые описанный в операторе return или в типе параметра, принадлежит к глобальной области видимости.
Специальные соглашения действуют на имена, введенные при описании параметров функции (§R.8.2.5) и в описаниях friend (§R.11.4).
Имя может быть скрыто явным описанием того же имени в объемлющем блоке или классе. Скрытое имя члена класса все-таки можно использовать, если оно предваряется именем класса, к которому применена операция:: (§R.4.1, §R.9.4, §R.10). Скрытое имя объекта, функции, типа или элемента перечисления с файловой областью видимости можно использовать, если оно предваряется унарной операцией :: (§R.5.1). В дополнении к этому, имя класса (§R.9.1) может быть скрыто именем объекта, функции или элемента перечисления, имеющего ту же область видимости. Если класс и объект, или функция, или элемент перечисления описаны (в любом порядке) с одинаковым именем в одной области видимости, то имя класса становится скрытым. Имя класса, скрытое в локальной области видимости или в области видимости класса именем объекта, функции или элемента перечисления, все-таки можно использовать, если предварить его подходящей спецификацией class, struct или union (§R.7.1.6). Аналогично, скрытое имя элемента перечисления можно использовать, если предварить его спецификацией типа enum (§R.7.1.6). В §R.10.4 приводится сводка правил области видимости. Моментом описания имени считается момент завершения описателя имени (§R.8), предшествующей части инициализации (если она есть).
Например,
int x = 12;
{ int x = x; }
Здесь второе x инициализируется своим собственным (неопределенным) значением.
Моментом описания элемента перечисления считается момент сразу после появления его идентификатора, например:
enum { x = x };
Здесь элемент перечисления x опять инициализируется своим собственным (неопределенным) значением.
R.3.3 Программа и связывание
Программа состоит из одного или нескольких файлов, связываемых вместе (§R.2). Файл состоит из последовательности описаний.
Имя с файловой областью видимости, которое явно описано как static, является локальным в своей единице трансляции и может использоваться для именования объектов, функций и т.п. в других единицах трансляции. Говорят, что такие имена имеют внутреннее связывание. Имя с файловой областью видимости, которое явно описано со спецификацией inline, является локальным в своей единице трансляции. Имя с файловой областью видимости, которое явно описано со спецификацией const и не описано явно как extern, считается локальным в своей единице трансляции. То же верно для имени класса, которое не использовалось в нелокальных для данной единицы трансляции описаниях объекта, функции или класса, и который не имеет статических членов (§R.9.4), не имеет функций-членов, кроме подстановок (§R.9.3.2). Всякое описание некоторого имени с файловой областью видимости, которое не описано одним из перечисленных способов так, чтобы иметь внутреннее связывание, в многофайловой программе обозначает один и тот же объект (§R.3.7), функцию (§R.8.2.5) или класс (§R.9). Такие имена называются внешними или говорят, что они имеют внешнее связывание. В частности, поскольку нельзя описать имя класса как static, всякое употребление имени некоторого класса с файловой областью видимости, который (класс) использовался для описания объекта или функции с внешним связыванием, или же который имеет статический член или функцию-член, не являющуюся подстановкой, будет обозначать один и тот же класс.