static (au niveau du fichier/module) :
static, la portée est limitée au module (fichier) compilé.extern :
Important : static — pour cacher l'implémentation, extern — pour lier entre les modules.
Exemple :
main.c :
static int hidden_var = 5; extern int shared_var; int main() { printf("partagé %d", shared_var); }
shared.c :
int shared_var = 10;
Tenter d'utiliser hidden_var à partir d'un autre fichier déclenchera une erreur d'édition des liens.
Que se passera-t-il si vous définissez une variable avec le même nom et avec différents modificateurs static/extern dans différents modules ?
Réponse: Chaque variable static (par exemple, static int foo; dans différents fichiers) est un objet entièrement indépendant. La déclaration extern int foo; recherche une variable globale partagée nommée foo. On ne peut pas mélanger static et extern — cela entraînera une erreur d'édition des liens si, dans un fichier, foo est définie comme static, et dans un autre est déclarée extern.
Histoire Dans un projet, une duplication de fonctions portant le même nom (sans static) a été découverte dans différents modules : l'éditeur de liens n'a lié qu'une seule d'entre elles, l'autre a "disparu", ce qui a affecté la logique de l'application.
Histoire Dans un grand projet, une variable globale
int counter;a été déclarée dans deux modules, deux fois sans extern. En conséquence, le comportement de l'application dépendait de l'ordre de liaison, des symboles conflictuels apparaissaient parfois.
Histoire Un module utilisait une fonction avec une portée erronée : elle avait été définie comme static, et le développeur tentait de l'appeler depuis un autre fichier source — le programme ne s'est pas compilé sans changer le modificateur en extern (ou sans supprimer static).