Programmeren in C/C-Preprocessor: verschil tussen versies

Verwijderde inhoud Toegevoegde inhoud
Kleuske (overleg | bijdragen)
Pagina aangemaakt: "De C-Preprocessor met zijn ''preprocessor-directives'' staat, technisch gezien, los van de C-Compiler en heeft tot taak de broncode "voor te koken", dat wil zeggen, losse besta..."
 
Kleuske (overleg | bijdragen)
Geen bewerkingssamenvatting
Regel 69:
int fout = 5*FOUT(2); /* 5 * 2 * 2 + 1 = 21 (niet wat je verwachten zou...) */
int goed = 5*GOED(2); /* 5 * ( 2 * 2 + 1) = 5 * 5 = 25 */
</source>
 
== #if, #ifdef, #ifndef ==
 
Met behulp van conditionele preprocessor directives kunnen selectief stukken code worden opgenomen of genegeerd. Dit is buitengewoon handig in velerlei omstandigheden, selectief opnemen van debug-code, bijvoorbeeld. De algemene structuur is die van een ''if-then-else'' constructie zoals die in vele talen voorkomt.
 
=== #if (<expressie>)===
 
De '''#if''' preprocessor directive voegt afhankelijk van de expressie code in. Het is belangrijk daarbij op te merken dat de expressie alleen mag bestaan uit elementen die bekend zijn op het moment dat de C-Preprocessor actief is. Het bis dus nutteloos (en zelfs fout) in de expressie C-variabelen of functie-aanroepen te gebruiken, die zijn namelijk pas bekend als de C-Compiler aan de beurt komt.
 
<source lang="c">
#if (FOOBAR == 2)
printf("Foobar is gedefinieerd en FOOBAR is gelijk aan 2\n");
#else
printf("Foobar is niet gedefinieerd of FOOBAR is niet gelijk aan 2\n");
#endif
</source>
 
Het volgende voorbeeldje (ontleend aan ''real life'' code van een beunhaas) werkt niet naar behoren, wat de beunhaas in kwestie erg verbaasde.
 
<source lang="c">
/* HEEL ERG FOUT! */
#if (sizeof(int) == 4)
printf("sizeof(int) == 4\n");
#else
printf("sizeof(int) != 4\n");
#endif
</source>
 
=== #ifdef en #ifndef ===
 
Deze constructies werken op dezelfde manier als de #if-directive, met dien verstande dat de conditie het wel (#ifdef) dan niet (#ifndef) gedefinieerd zijn van een macro betreft.
 
<source lang="c">
#ifdef FOOBAR
printf("FOOBAR is gedefinieerd\n");
#else
printf("FOOBAR is niet gedefinieerd\n");
#endif
</source>
 
en
 
<source lang="c">
#ifndef FOOBAR
printf("FOOBAR is niet gedefinieerd\n");
#else
printf("FOOBAR is gedefinieerd\n");
#endif
</source>
 
De ''#ifndef'' constructie wordt veel gebruikt als ''guard'' (wachtpost) in header bestanden om te voorkomen dat interfaces dubbel worden gedefineerd als een header om de een of andere reden tweemaal wordt ingevoegd (met '''#include "foobar.h"''). Dit kan makkelijker optreden dan beginnelingen soms denken. Om deze reden is het gebruikelijk headerfiles met deze constructie te beschermen.
 
<source lang="c">
/*
* FILE: foobar.h
* AUTHOR: Pietje Puk <p.puk@nowhere.net>
* PURPOSE: Barring the Foo.
*/
 
#ifndef GUARD_FOOBAR
#define GUARD_FOOBAR
 
/* Hier staat de echte interface. Zodra deze eenmaal is ingevoegd is "GUARD_FOOBAR" gedefinieerd en zullen
* de volgende #include directives dit stuk overslaan. Handig ....
*/
typedef struct
{
int foo;
char* bar;
}
#endif
 
/*
* End of file
*/
</source>
Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.