C-opslagklassen: Scope, levensduur en gebruik
Wat is een opslagklasse?
Een opslagklasse (storage class) bepaalt de zichtbaarheid (scope) en levensduur van variabelen/functies. Vier klassen in C:
autoregisterstaticextern
auto – standaard lokaal
Standaard voor alle lokale variabelen. Slechts binnen functie/blok zichtbaar. auto int x; is gelijk aan int x;. Zeldzaam expliciet gebruikt.
register – hint voor processorregister
Suggereert compiler om variabele in CPU-register op te slaan (snellere toegang). Beperkingen:
- Maximaal registergrootte (meestal 1 woord)
- Geen adres (
&operator niet toegestaan) - Alleen voor variabelen die veel gebruikt worden (tellers)
- Compiler kan negeren
{ register int counter; }
static – behoud waarde tussen aanroepen
Lokaal static: behoudt waarde tussen functie-aanroepen, initialiseer 1×.
void func() {
static int count = 0; // initialisatie 1x
count++;
printf("%d ", count);
}
Globale static: beperkt zichtbaarheid tot bestand (file scope), geen externe linking.
Voorbeeld
#include <stdio.h>
static int global_count = 5; // file-scope
void func(void) {
static int local_static = 5; // behoudt waarde
local_static++;
printf("local_static=%d, global_count=%d\n", local_static, global_count);
}
int main() {
while (global_count--) func();
return 0;
}
local_static=6, global_count=4 local_static=7, global_count=3 local_static=8, global_count=2 local_static=9, global_count=1 local_static=10, global_count=0
extern – referentie naar globale variabele in ander bestand
Gebruikt in multi-bestandsprojecten. extern declaratie zonder initialisatie.
Bestand 1: main.c
#include <stdio.h>
int count = 5; // definitie
extern void write_extern(); // declaratie functie
int main() {
write_extern();
return 0;
}
Bestand 2: support.c
#include <stdio.h>
extern int count; // referentie naar main.c
void write_extern(void) {
printf("count is %d\n", count);
}
Compileren
$ gcc main.c support.c -o programma $ ./programma count is 5
Samenvattingstabel
| Klasse | Scope | Levensduur | Initieel | Adres neembaar? |
|---|---|---|---|---|
auto | lokaal (blok) | functie-aanroep | garbage | ja |
register | lokaal (blok) | functie-aanroep | garbage | nee |
static (lokaal) | lokaal (blok) | programma | 0/NULL | ja |
static (globaal) | bestand | programma | 0/NULL | ja |
extern | globaal (hele prog) | programma | 0/NULL (in definerend bestand) | ja |
C Taal
- Hoe flute aantal frees prestaties beïnvloedt
- C++ Structuren vs Classes: Een praktische gids voor embedded-ontwikkelaars
- C++ klassen & objecten: praktische gids voor object-georiënteerd programmeren
- C++ Friend Functies en Friend Classes: Toegangscontrole Beheersen
- C-opslagklassen begrijpen: Bereik, levensduur en prestaties
- Storage Classes in C++ Begrijpen: Scope, Levensduur en Gebruik
- C++ Interfaces: Abstracte Klassen & Pure Virtual Functions Beheersen
- C# Klassen Beheersen: Blauwprint voor Krachtig Objectgeoriënteerd Programmeren
- Python's str.count() beheersen: Karakters & substrings tellen met voorbeelden
- Python list.count(): Expert Gids met Praktische Voorbeelden
- Java Onder de Knie: Objects, Classes en Kern OOP Concepten