¿Por qué la redefinición de una variable global estática da un error en tiempo de comstackción cuando la redefinición de una variable global no lo hace?

El código de comstackción 1 da un error ‘ i redefined ‘, pero el código 2 no muestra un error similar. ¿Por que es esto entonces?

Código 1

 static int i; //Declaring the variable i. static int i=25; //Initializing the variable. static int i; //Again declaring the variable i. int main(){ return 0; } 

Código 2

 int i; //Declaring the variable i. int i=25; //Initializing the variable. int i; //Again declaring the variable i. int main(){ return 0; } 

Ambos deben comstackr.

Ambos int i; y static int i; Son definiciones provisionales en C, ya que no tienen un inicializador y no son extern . Se le permiten múltiples declaraciones tentativas y, como máximo, una definición no tentativa para cualquier objeto en una unidad de traducción, siempre que las definiciones no entren en conflicto con el tipo o la vinculación.

ISO / IEC 9899: 1999 6.9.2:

Una statement de un identificador para un objeto que tiene un scope de archivo sin un inicializador, y sin un especificador de clase de almacenamiento o con un static especificador de clase de almacenamiento, constituye una definición provisional . Si una unidad de traducción contiene una o más definiciones tentativas para un identificador, y la unidad de traducción no contiene definiciones externas para ese identificador, entonces el comportamiento es exactamente como si la unidad de traducción contiene una statement de scope de archivo de ese identificador, con el tipo compuesto como del final de la unidad de traducción, con un inicializador igual a 0.