C Academy · Les

Include-guards

Voorkom dubbele inclusie.

Les 2 van 413 stappen

Include-guards is een gratis C Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject C Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus C Academy bevat in totaal 4 lessen.

Het probleem van dubbele opname

Kopteksten sluiten vaak andere kopteksten in. Daardoor kan één koptekst eenvoudig twee keer in hetzelfde bronbestand worden opgenomen.

In dat geval komt elke declaratie erin twee keer voor. Voor typedefinities zoals struct of typedef is dat een compilatiefout: een type mag niet meer dan één keer worden gedefinieerd.

Hoe dit ongemerkt gebeurt

Stel dat a.h en b.h allebei types.h insluiten. Een bronbestand dat beide insluit, bevat uiteindelijk twee keer de tekst van types.h.

De preprocessor kopieert de tekst van de koptekst blind, waardoor de definities in types.h worden gedupliceerd en een fout wegens herdefinitie ontstaat.

/* a.h */ #include "types.h"
/* b.h */ #include "types.h"
/* main.c */
#include "a.h"
#include "b.h"   /* types.h now seen twice */

De insluitbeveiliging

Een insluitbeveiliging is een kleine preprocessortruc die ervoor zorgt dat een koptekst veilig meerdere keren kan worden ingesloten.

Deze wikkelt de hele koptekst in een voorwaarde, zodat de inhoud alleen de eerste keer wordt verwerkt. Latere insluitingen worden volledig overgeslagen.

#ifndef TYPES_H
#define TYPES_H

/* header contents here */

#endif /* TYPES_H */

Hoe de beveiliging werkt

De eerste keer dat de koptekst wordt gezien, is TYPES_H niet gedefinieerd. Daarom is #ifndef waar en wordt de inhoud verwerkt. Daarna stelt #define de macro in.

Bij elke latere insluiting bestaat TYPES_H al. Daarom is #ifndef onwaar en springt de preprocessor door naar #endif.

#ifndef TYPES_H   /* true only the first time */
#define TYPES_H   /* remember we've been here */
/* ... body ... */
#endif

Een volledig beveiligde koptekst

Hier staat een realistische koptekst met een beveiliging die een typedefinitie beschermt.

Zelfs als veel bestanden point.h direct of indirect insluiten, wordt de Point-structuur precies één keer per vertaaleenheid gedefinieerd.

/* point.h */
#ifndef POINT_H
#define POINT_H

typedef struct {
    int x;
    int y;
} Point;

Point point_add(Point a, Point b);

#endif

De macronaam kiezen

De macronaam van de beveiliging moet uniek zijn binnen je hele project, anders kunnen twee kopteksten botsen en elkaar ongemerkt verbergen.

Een veelgebruikte conventie leidt de naam af van de bestandsnaam in hoofdletters: point.h wordt POINT_H en net/socket.h wordt NET_SOCKET_H.

#ifndef NET_SOCKET_H
#define NET_SOCKET_H
/* ... */
#endif

Gereserveerde namen vermijden

Identifiers die beginnen met een underscore gevolgd door een hoofdletter, of die dubbele underscores bevatten, zijn gereserveerd voor de compiler en de standaardbibliotheek.

Vermijd beveiligingen zoals __POINT_H__. Een eenvoudige vorm met een underscore aan het einde, zoals POINT_H, is veilig en duidelijk.

#ifndef _POINT_H_   /* risky: reserved name pattern */
#ifndef POINT_H     /* preferred */

Het alternatief #pragma once

De meeste moderne compilers ondersteunen #pragma once, één regel bovenaan een koptekst die hetzelfde doet.

Dit is korter en voorkomt botsingen tussen namen, maar maakt geen deel uit van de C-standaard. Traditionele #ifndef-beveiligingen werken overal.

/* point.h */
#pragma once

typedef struct { int x; int y; } Point;

Beveiligingen versus pragma

#ifndef-beveiligingen zijn volledig overdraagbaar en standaard, maar vereisen voor elke koptekst een unieke macro.

#pragma once is compact en voorkomt botsingen, maar is afhankelijk van compilerondersteuning. Sommige projecten gebruiken beide: een pragma plus een klassieke beveiliging voor maximale veiligheid.

#pragma once
#ifndef POINT_H
#define POINT_H
/* ... */
#endif

Beveiligingen gelden per vertaaleenheid

Een insluitbeveiliging voorkomt dubbele opname binnen één bronbestand terwijl dat wordt gecompileerd.

De beveiliging voorkomt niet dat een koptekst één keer wordt verwerkt in elk afzonderlijk .c-bestand. Dat is prima, omdat elk bronbestand een afzonderlijke vertaaleenheid is.

Maak er een gewoonte van

Voeg vanaf de allereerste regel een insluitbeveiliging toe aan elke koptekst die je schrijft. Dit kost drie regels en voorkomt een hele categorie verwarrende fouten.

Zelfs eenvoudige kopteksten kunnen later indirect via andere kopteksten worden ingesloten, dus vanaf het begin beveiligen bespaart problemen.

/* config.h */
#ifndef CONFIG_H
#define CONFIG_H
#define MAX_USERS 100
#endif

Korte controle

Controleer of je insluitbeveiligingen begrijpt.

Samenvatting

Je hebt geleerd waarom het tweemaal insluiten van een koptekst fouten wegens herdefinitie veroorzaakt en hoe een insluitbeveiliging dit voorkomt.

Gebruik #ifndef/#define/#endif met een unieke macro, of #pragma once. Vervolgens bekijken we hoe je variabelen met extern tussen bestanden deelt.

Gratis beginnen

Leer C met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
39
Lessen
144

Veelgestelde vragen

Is de les “Include-guards” gratis?

Ja — de volledige tekst van “Include-guards” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus C Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus C Academy bevat in totaal 4 lessen.

Wat leer ik in “Include-guards”?

Voorkom dubbele inclusie. Je oefent met C Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met C Academy te beginnen?

Ervaring vooraf is niet nodig. C Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.

Hoe lang duurt de les “Include-guards”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over C Academy?

Ja. Elke les over C Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Header- en bronbestanden
  2. Include-guards
  3. extern en linkage
  4. Meerdere bestanden compileren
← Terug naar C Academy