[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 надається зовнішній зв'язок, що робить програму неправильною.