¿Por qué extern int a; ¿Inicialización dando error localmente pero no globalmente?

extern int a = 10; // it is not giving error int main () { extern int b = 10; //it is giving error return 0; } 

error: ‘b’ tiene tanto ‘extern’ como inicializador extern int b = 10;

Con referencia a C11 (N1570) 6.7.9 / 5 Inicialización :

Si la statement de un identificador tiene un scope de bloque, y el identificador tiene un enlace externo o interno, la statement no tendrá inicializador para el identificador.

La regla se coloca dentro de la sección de restricciones, por lo que cualquier comstackdor conforme debe rechazar el código que lo viola.

El punto de la palabra clave extern en el ámbito del bloque es declarar algún objeto existente desde el ámbito externo. No tendría mucho sentido declarar un objeto y darle algún otro valor en el punto de la statement.

La forma recomendada de declarar objetos externos es colocar sus declaraciones en el ámbito del archivo (en la parte superior del código fuente), por lo que son fáciles de detectar y administrar por el progtwigdor de mantenimiento.