[basic.link/7] deve ser a parte relevante da Norma. No rascunho atual, ele diz:
O nome de uma função declarada no escopo do bloco e o nome de uma variável declarada por uma extern
declaração de escopo do bloco têm ligação. Se uma declaração desse tipo estiver anexada a um módulo nomeado, o programa está incorreto. Se houver uma declaração visível de uma entidade com ligação, ignorando as entidades declaradas fora do escopo de espaço para nome mais interno, de modo que a declaração de escopo do bloco seja uma redeclaração (possivelmente mal formada) se as duas declarações aparecerem na mesma região declarativa, o A declaração de escopo do bloco declara a mesma entidade e recebe o vínculo da declaração anterior. Se houver mais de uma entidade correspondente, o programa está mal formado. Caso contrário, se nenhuma entidade correspondente for encontrada, a entidade do escopo do bloco receberá ligação externa.Se, dentro de uma unidade de tradução, a mesma entidade for declarada com vínculo interno e externo, o programa será mal formado.
Observe que o exemplo subsequente corresponde quase exatamente ao seu caso:
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
}
}
Portanto, o programa deve estar mal formado. A explicação está abaixo do exemplo:
Sem a declaração na linha 2, a declaração na linha 3 seria vinculada à declaração na linha 1. Como a declaração com ligação interna está oculta, no entanto, o nº 3 recebe ligação externa, tornando o programa mal formado.