La déclaration et l'initialisation des variables sont la pierre angulaire du langage C avec des règles très strictes et parfois non évidentes. La façon dont et où vous déclarez une variable influencera même sa valeur initiale (concernant l'initialisation), ainsi que son lien avec l'objet mémoire (concernant la déclaration et la définition).
Le C remonte à une époque où l'optimisation de la mémoire était une priorité. Les développeurs devaient déclarer et initialiser les variables eux-mêmes, sinon le comportement du programme devenait imprévisible. Dans les compilateurs C modernes, même un léger écart entraîne des erreurs de linkage ou une initialisation implicite avec des "déchets".
Erreurs principales :
Exemple de code :
#include <stdio.h> int global_var; // définition, auto-initialisation = 0 static int static_global_var; // static-fichier, auto-initialisation = 0 extern int extern_var; // déclaration, définition quelque part ailleurs void foo() { int local_var; // automatique, non initialisée -> déchets static int static_local_var; // static, auto-initialisée à 0 }
Caractéristiques clés :
1. Les variables automatiques (locales sans static et extern) sont-elles initialisées automatiquement à 0 par le compilateur ?
Non, elles contiennent des déchets. Leur valeur n'est pas définie, utiliser avant l'initialisation est une erreur.
2. Peut-on définir plusieurs fois une variable avec extern dans différents fichiers ?
Non, une seule définition est nécessaire, les autres étant des déclarations via extern, sinon le linker renverra une erreur "multiple definition" ou "undefined symbol".
3. Quelle est la différence entre la déclaration d'une fonction et sa définition ?
La déclaration est seulement le prototype (sans corps) ; la définition contient nécessairement le corps de la fonction. Pour les variables, la déclaration via extern ne réserve pas de mémoire, alors que pour les fonctions, les deux formes sont autorisées.
Une variable globale int counter; est déclarée dans deux fichiers d'en-tête. Le projet a été lié avec une erreur de définition multiple.
Avantages :
Inconvénients :
Dans l'en-tête, on écrit extern int counter;, définition int counter = 0; — uniquement dans un fichier C.
Avantages :
Inconvénients :