Pourquoi la redéfinition d’une variable globale statique entraîne-t-elle une erreur de compilation alors que la redéfinition d’une variable globale ne le fait pas?

Le code de compilation 1 donne une erreur ‘ i redefined ‘, mais le code 2 ne montre aucune erreur similaire. Pourquoi est-ce?

Code 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; } 

Code 2

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

Les deux devraient comstackr.

Les deux int i; et static int i; sont des définitions provisoires en C car ils ne disposent pas d’initialiseur et ne sont pas extern . Vous êtes autorisé à faire plusieurs déclarations provisoires et au plus une définition non provisoire pour tout object d’une unité de traduction tant que les définitions ne sont pas en conflit de type ou de lien.

ISO / IEC 9899: 1999 6.9.2:

La déclaration d’un identifiant pour un object ayant une scope de fichier sans initialiseur, et sans spécificateur de classe de stockage ou avec un spécificateur de classe de stockage static , constitue une définition provisoire . Si une unité de traduction contient une ou plusieurs définitions provisoires pour un identificateur et que l’unité de traduction ne contient aucune définition externe pour cet identificateur, le comportement est exactement comme si l’unité de traduction contenait une déclaration de la scope du fichier de cet identificateur, avec le type composite as de la fin de l’unité de traduction, avec un initialiseur égal à 0.