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