[basic.link]/6
Имя функции, объявленной в области блока, и имя переменная, объявленная объявлением блока
extern
, имеет связь. Если существует объявление visible объекта с привязкой, имеющей одно и то же имя и тип, игнорируя объекты, объявленные вне самой внутренней охватывающая область пространства имен, объявление области блока объявляет, что и получает связь с предыдущей декларацией. Если существует более одного такого совпадающего объекта, программа плохо сформирован. В противном случае, если соответствующий объект не найден, область действия блока объект получает внешнюю связь. [Пример:static void f(); static int i = 0; // #1 void g() { extern void f(); // internal linkage int i; // #2 i has no linkage { extern void f(); // internal linkage extern int i; // #3 external linkage } }
В этой программе есть три объекта с именем
i
. Объект с внутренней связью, введенный декларацией в глобальном масштабе (строка # 1), объект с автоматической продолжительностью хранения и отсутствие связей, введенных декларацией в строке # 2, и объект с статическим временем хранения и внешней связью, введенные декларацией в строке # 3. -end пример]
У меня есть два комментария об этом абзаце:
- Объявление
static int i = 0;
в глобальной области видимости не отображается внутри блока, содержащего объявлениеextern int i;
(# 3). Поэтому мы можем только сказать, что это последнее объявление имеет внешнюю связь, т.е. Мы не можем связать его с объявлением № 1. - В противном случае, если объявление
static int i;
считается видимым объявлением № 3, чем в соответствии с текстом в абзаце, объявление области блока объявляет один и тот же объект и получает связь с предыдущей декларацией, то есть внутреннюю связь, а не внешняя связь, как указано в примере.
Что мне здесь не хватает?