[basic.link/7] debería ser la parte relevante de la Norma. En el borrador actual, dice:
El nombre de una función declarada en el alcance del bloque y el nombre de una variable declarada por una extern
declaración del alcance del bloque tienen vinculación. Si dicha declaración se adjunta a un módulo con nombre, el programa está mal formado. Si hay una declaración visible de una entidad con vinculación, ignorando las entidades declaradas fuera del alcance del espacio de nombres más cercano, de modo que la declaración del alcance del bloque sería una redeclaración (posiblemente mal formada) si las dos declaraciones aparecieran en la misma región declarativa, el La declaración de alcance de bloque declara esa misma entidad y recibe el enlace de la declaración anterior. Si hay más de una entidad coincidente, el programa está mal formado. De lo contrario, si no se encuentra una entidad coincidente, la entidad de alcance de bloque recibe un enlace externo.Si, dentro de una unidad de traducción, se declara la misma entidad con enlaces internos y externos, el programa está mal formado.
Tenga en cuenta que el siguiente ejemplo coincide casi exactamente con su 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
}
}
Entonces, el programa debe estar mal formado. La explicación está debajo del ejemplo:
Sin la declaración en la línea # 2, la declaración en la línea # 3 se vincularía con la declaración en la línea # 1. Sin embargo, debido a que la declaración con vinculación interna está oculta, # 3 recibe vinculación externa, lo que hace que el programa esté mal formado.