Globale variabelen zijn vanaf het begin in de programmeertaal C opgenomen als een middel om gegevens op te slaan die toegankelijk zijn in alle functies van het programma. Ze maken het mogelijk om informatie uit te wisselen tussen verschillende delen van de code zonder expliciete overdracht van waarden via functiegroepen. Dergelijke variabelen worden opgeslagen in een aparte geheugenruimte en bestaan gedurende de gehele levensduur van het programma.
Overmatig en ongecontroleerd gebruik van globale variabelen leidt tot onderhoudsproblemen van de code, bemoeilijkt het vinden van fouten en vergroot de risico's van naamconflicten. In grote projecten is het moeilijk te begrijpen waar gegevens worden gewijzigd die globaal toegankelijk zijn, wat het debuggen bemoeilijkt. Bovendien kan een onjuiste verklaring van globale variabelen in verschillende bestanden (modules) leiden tot linkfouten en duplicatie van data.
Een optimale praktijk is om globale variabelen expliciet te declareren in één .c bestand en hun prototypes met het sleutelwoord extern naar de header .h bestanden te verplaatsen. Op deze manier ontstaat er één opslagplaats, en voorkomt de compiler duplicatie. Om het aantal globale variabelen te minimaliseren, worden statische variabelen met een zichtbaarheid binnen het bestand gebruikt. Overmatig gebruik van globale status wordt vervangen door datastructuren die tussen functies worden doorgegeven.
Voorbeeldcode:
// file.h #ifndef FILE_H #define FILE_H extern int global_counter; #endif // file.c #include "file.h" int global_counter = 0; // main.c #include "file.h" #include <stdio.h> int main() { global_counter++; printf("%d\n", global_counter); return 0; }
Belangrijke kenmerken:
extern gebruikt.Kan een globale variabele als statisch worden gedeclareerd? Hoe verschilt deze dan van een gewone globale variabele?
Ja, een globale variabele die is gedeclareerd met het sleutelwoord static, is alleen zichtbaar binnen het bestand waarin deze is gedeclareerd. Ze bestaat nog steeds gedurende de gehele werking van het programma, maar een andere compilatie (een andere .c-bestand) kan er niet naar verwijzen. Dit wordt gebruikt voor het encapsuleren van gegevens op het bestandniveau.
Moet je altijd extern gebruiken om toegang te krijgen tot een globale variabele vanuit een ander bestand?
Ja, als je wilt verwijzen naar een globale variabele die in een andere module is gedefinieerd, moet je deze declareren met het sleutelwoord extern (meestal in het headerbestand). Anders zal de compiler denken dat je de variabele opnieuw definieert.
// a.c int global_var = 1; // b.c extern int global_var;
Zal de volgende code werken?
// a.c int var; // b.c int var;
Nee, deze code zal leiden tot een linkfout, omdat de variabele twee keer is gedefinieerd. De definitie van een globale variabele moet uniek zijn, gebruik extern voor toegang.
Een ontwikkelaar plaatst configuratieparameters in globale variabelen zonder toegangsbeperkingen:
Voordelen:
Nadelen:
Globale variabelen worden alleen in één bestand gedefinieerd, toegankelijk via extern, en strikt gedocumenteerd. In andere gevallen wordt een statische bestandsscope of parameterstructurering gebruikt:
Voordelen:
Nadelen: