[basic.link]/6не может понять декларацию # 3 в примере [basic.link]/6 14
Имя функции, объявленной в блоке области применения и имя переменной , объявленной областью блока
extern
, имеет связь. Если есть видна декларации субъекта с связью, имеющей же именем и типа, игнорируя объекты, объявленных вне внутреннего ограждающих области пространства имен, декларация блока-сферы заявляет, что же сущность и получает связь предыдущей декларации , Если существует более одного такого совпадающего объекта, программа плохо сформирована. В противном случае, если ни один соответствующий объект не найден, то блок сфера объект получает внешнее связывание [Пример:.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, чем в соответствии с текстом в абзаце, объявление области блока объявляет одну и ту же сущность и получает связь с предыдущей декларацией, то есть внутреннюю связь, а не внешнюю связь, как указано в примере.
Что мне здесь не хватает?