static (op het bestand/module niveau):
static zijn gedeclareerd, is de scope beperkt tot het te compileren module (bestand).extern:
Belangrijk: static — voor het verbergen van implementatie, extern — voor binding tussen modules.
Voorbeeld:
main.c:
static int hidden_var = 5; extern int shared_var; int main() { printf("shared %d", shared_var); }
shared.c:
int shared_var = 10;
Proberen om hidden_var uit een ander bestand te gebruiken, zal eenkoppelingsfout veroorzaken.
Wat gebeurt er bij het definiëren van een variabele met dezelfde naam en verschillende specificaties static/extern in verschillende modules?
Antwoord: Elke static-variabele (bijvoorbeeld, static int foo; in verschillende bestanden) is een volkomen onafhankelijk object. De declaratie extern int foo; zoekt één gedeelde globale variabele met de naam foo. Het is niet toegestaan om static en extern te mengen — dit leidt tot een koppelingsfout als foo in het ene bestand als static is gedefinieerd, en in het andere als extern is gedeclareerd.
Verhaal In een project werd duplicatie van functies met dezelfde naam (zonder static) in verschillende modules ontdekt: de linker verbond alleen één van hen, de andere "verdween", wat de logica van de applicatie beïnvloedde.
Verhaal In een groot project was er een globale variabele
int counter;in twee modules gedeclareerd, beide keren zonder extern. Als gevolg hiervan hing het gedrag van de applicatie af van de volgorde van koppeling, soms leidden conflicterende symbolen tot problemen.
Verhaal Een module gebruikte een functie met een foutieve scope: deze was als static gedefinieerd, en de ontwikkelaar probeerde deze vanuit een ander bronbestand aan te roepen — het programma compileerde niet zonder de modifier te veranderen naar extern (of zonder static te verwijderen).