C Preprocessor & Macros: #include, #define en voorwaardelijke compilatie onder de knie krijgen
C Preprocessor & Macros
Ontdek de kracht van C's preprocessor: leer headers includeren, constanten en functies definiëren, en compilatiestroom controleren met voorwaardelijke directieven.

De C preprocessor draait voor de compiler, en transformeert je broncode door macros uit te breiden, headerbestanden te includeren, en voorwaardelijke statements te evalueren. Het is een essentieel hulpmiddel voor het schrijven van flexibele, herbruikbare code.
Alle preprocessor-directieven beginnen met een # symbool. Bijvoorbeeld:
#define PI 3.14
Header-bestanden includeren: #include
De #include directief voegt de inhoud van een headerbestand direct in je bronbestand in. Gangbaar gebruik:
#include <stdio.h>
Zonder #include <stdio.h> zouden functies zoals printf() en scanf() ongedefinieerd zijn. Je kunt ook custom headers aanmaken:
#include "my_header.h"
Custom headers zijn handig voor het groeperen van gerelateerde functiedeclaraties en constanten.
Constanten en expressies definiëren: #define
Een macro vervangt een token of expressie met een waarde vóór compilatie. Voorbeeld:
#define c 299792458 /* lichtsnelheid */
Het gebruik van c ergens in je programma expandeert naar 299792458.
Voorbeeld 1: PI definiëren
#include <stdio.h>
#define PI 3.1415
int main() {
float radius, area;
printf("Voer de straal in: ");
scanf("%f", &radius);
area = PI * radius * radius;
printf("Oppervlakte=%.2f", area);
return 0;
}
Functie-achtige Macros
Macros kunnen argumenten accepteren, functionerend als inline functies:
#define circleArea(r) (3.1415 * (r) * (r))
Voor circleArea(5) expandeert de preprocessor naar (3.1415 * 5 * 5).
Voorbeeld 2: Een functie-achtige macro gebruiken
#include <stdio.h>
#define PI 3.1415
#define circleArea(r) (PI * (r) * (r))
int main() {
float radius, area;
printf("Voer de straal in: ");
scanf("%f", &radius);
area = circleArea(radius);
printf("Oppervlakte = %.2f", area);
return 0;
}
Voorwaardelijke compilatie
Voorwaardelijke directieven laten je codeblokken includeren of uitsluiten bij compile-tijd, vergelijkbaar met if statements maar geëvalueerd vóór uitvoering.
Gangbare use cases
- Verschillende besturingssystemen of hardware targeten.
- Debug builds aanmaken zonder runtime overhead.
- Legacy codepaden behouden voor referentie.
Belangrijke directieven
#ifdef MACRO /* code wanneer MACRO gedefinieerd is */ #endif
#if EXPRESSIE /* code wanneer EXPRESSIE non-zero is */ #else /* code wanneer EXPRESSIE nul is */ #endif
#if EXPRESSIE /* code */ #elif ANDERE_EXPRESSIE /* alternatieve code */ #else /* fallback code */ #endif
#if defined BUFFER_SIZE && BUFFER_SIZE >= 2048 /* buffer is groot genoeg */ #endif
Voorgedefinieerde Macros
| Macro | Waarde |
|---|---|
__DATE__ | String van de huidige compilatiedatum |
__FILE__ | String van de huidige bestandsnaam |
__LINE__ | Regelnummer waar de macro verschijnt |
__STDC__ | Non-nul als de compiler de ANSI C standaard volgt |
__TIME__ | String van de huidige compilatietijd |
Voorbeeld 3: Compilatietijd weergeven
#include <stdio.h>
int main() {
printf("Huidige tijd: %s", __TIME__);
return 0;
}
Output voorbeeld:
Huidige tijd: 19:54:39
Aanbevolen leesstof
- Line Control
- Pragmas
- Preprocessor Output
- Overige Directieven
C Taal
- Uitgebreide Samenvatting van Weerstanden, Spoelen, en Condensatoren in AC-Stromingen
- C# Keywords en Identifiers begrijpen: Regels, lijsten en best practices
- C# Classes & Objects: Fundamenten voor Robuuste OOP
- C# Abstract Classes & Methods: Een Praktische Gids
- C# Partial Classes en Methods: Een Praktische Gids
- C# Sealed Classes en Methods: Wanneer en Hoe Te Gebruiken
- C# preprocessor directives: een praktische gids
- C Sleutelwoorden & Identifiers: Een Praktische Gids
- C-constanten en literals: Types, gebruik en best practices
- Invoer en uitvoer in C programmeren: Volledige gids
- De C-preprocessor (CPP) begrijpen: Hoe het de compilatie vereenvoudigt