C - Preprocessors
De C Preprocessor is geen onderdeel van de compiler, maar is een aparte stap in het compilatieproces. In eenvoudige bewoordingen is een C-preprocessor slechts een hulpmiddel voor tekstvervanging en instrueert het de compiler om de vereiste voorbewerking uit te voeren vóór de eigenlijke compilatie. We zullen naar de C Preprocessor verwijzen als CPP.
Alle preprocessor-opdrachten beginnen met een hekje (#). Het moet het eerste niet-lege teken zijn en voor de leesbaarheid moet een preprocessor-instructie in de eerste kolom beginnen. In de volgende sectie worden alle belangrijke preprocessor-richtlijnen opgesomd −
Zr.nr. | Richtlijn en beschrijving |
---|---|
1 | #define Vervangt een preprocessor-macro. |
2 | #include Voegt een bepaalde kop in uit een ander bestand. |
3 | #undef Definieert een preprocessor-macro. |
4 | #ifdef Retourneert waar als deze macro is gedefinieerd. |
5 | #ifndef Retourneert waar als deze macro niet is gedefinieerd. |
6 | #if Test of een voorwaarde voor het compileren waar is. |
7 | #else Het alternatief voor #if. |
8 | #elif #else en #if in één statement. |
9 | #endif Beëindigt preprocessor voorwaardelijk. |
10 | #fout Drukt foutmelding af op stderr. |
11 | #pragma Geeft speciale commando's aan de compiler, met behulp van een gestandaardiseerde methode. |
Voorbeelden van preprocessors
Analyseer de volgende voorbeelden om de verschillende richtlijnen te begrijpen.
#define MAX_ARRAY_LENGTH 20
Deze instructie vertelt de CPP om instanties van MAX_ARRAY_LENGTH te vervangen door 20. Gebruik #define voor constanten om de leesbaarheid te vergroten.
#include <stdio.h> #include "myheader.h"
Deze richtlijnen vertellen de CPP om stdio.h op te halen uit System Libraries en voeg de tekst toe aan het huidige bronbestand. De volgende regel vertelt CPP om myheader.h . op te halen uit de lokale map en voeg de inhoud toe aan het huidige bronbestand.
#undef FILE_SIZE #define FILE_SIZE 42
Het vertelt de CPP om bestaande FILE_SIZE ongedaan te maken en te definiëren als 42.
#ifndef MESSAGE #define MESSAGE "You wish!" #endif
Het vertelt de CPP om MESSAGE alleen te definiëren als MESSAGE nog niet is gedefinieerd.
#ifdef DEBUG /* Your debugging statements here */ #endif
Het vertelt de CPP om de bijgevoegde instructies te verwerken als DEBUG is gedefinieerd. Dit is handig als u de -DDEBUG . passeert vlag naar de gcc-compiler op het moment van compilatie. Dit definieert DEBUG, dus je kunt debuggen tijdens het compileren in- en uitschakelen.
Vooraf gedefinieerde macro's
ANSI C definieert een aantal macro's. Hoewel ze allemaal beschikbaar zijn voor gebruik bij het programmeren, mogen de vooraf gedefinieerde macro's niet rechtstreeks worden gewijzigd.
Zr.nr. | Macro en beschrijving |
---|---|
1 | __DATUM__ De huidige datum als letterteken in "MMM DD YYYY"-formaat. |
2 | __TIME__ De huidige tijd als een letterlijk teken in "HH:MM:SS" formaat. |
3 | __FILE__ Dit bevat de huidige bestandsnaam als een letterlijke tekenreeks. |
4 | __LINE__ Dit bevat het huidige regelnummer als decimale constante. |
5 | __STDC__ Gedefinieerd als 1 wanneer de compiler voldoet aan de ANSI-standaard. |
Laten we het volgende voorbeeld proberen −
Live demo#include <stdio.h> int main() { printf("File :%s\n", __FILE__ ); printf("Date :%s\n", __DATE__ ); printf("Time :%s\n", __TIME__ ); printf("Line :%d\n", __LINE__ ); printf("ANSI :%d\n", __STDC__ ); }
Wanneer de bovenstaande code in een bestand test.c wordt gecompileerd en uitgevoerd, levert dit het volgende resultaat op −
File :test.c Date :Jun 2 2012 Time :03:36:24 Line :8 ANSI :1
Preprocessor-operators
De C-preprocessor biedt de volgende operators om macro's te maken −
De Macro Voortzetting (\) Operator
Een macro is normaal gesproken beperkt tot een enkele regel. De macro-vervolgoperator (\) wordt gebruikt om door te gaan met een macro die te lang is voor een enkele regel. Bijvoorbeeld −
#define message_for(a, b) \ printf(#a " and " #b ": We love you!\n")
De operator Stringize (#)
De tekenreeksoperator of nummertekenoperator ( '#' ), wanneer gebruikt binnen een macrodefinitie, converteert een macroparameter naar een tekenreeksconstante. Deze operator mag alleen worden gebruikt in een macro met een gespecificeerd argument of parameterlijst. Bijvoorbeeld −
Live demo#include <stdio.h> #define message_for(a, b) \ printf(#a " and " #b ": We love you!\n") int main(void) { message_for(Carole, Debra); return 0; }
Wanneer de bovenstaande code wordt gecompileerd en uitgevoerd, levert dit het volgende resultaat op −
Carole and Debra: We love you!
De operator token plakken (##)
De operator voor het plakken van tokens (##) binnen een macrodefinitie combineert twee argumenten. Hiermee kunnen twee afzonderlijke tokens in de macrodefinitie worden samengevoegd tot één token. Bijvoorbeeld −
Live demo#include <stdio.h> #define tokenpaster(n) printf ("token" #n " = %d", token##n) int main(void) { int token34 = 40; tokenpaster(34); return 0; }
Wanneer de bovenstaande code wordt gecompileerd en uitgevoerd, levert dit het volgende resultaat op −
token34 = 40
Het gebeurde zo omdat dit voorbeeld resulteert in de volgende feitelijke uitvoer van de preprocessor −
printf ("token34 = %d", token34);
Dit voorbeeld toont de aaneenschakeling van token##n in token34 en hier hebben we beide stringize gebruikt en token-plakken .
De gedefinieerde() operator
De preprocessor gedefinieerd operator wordt gebruikt in constante expressies om te bepalen of een identifier is gedefinieerd met #define. Als de opgegeven id is gedefinieerd, is de waarde waar (niet-nul). Als het symbool niet is gedefinieerd, is de waarde onwaar (nul). De gedefinieerde operator wordt als volgt gespecificeerd −
Live demo#include <stdio.h> #if !defined (MESSAGE) #define MESSAGE "You wish!" #endif int main(void) { printf("Here is the message: %s\n", MESSAGE); return 0; }
Wanneer de bovenstaande code wordt gecompileerd en uitgevoerd, levert dit het volgende resultaat op −
Here is the message: You wish!
Geparameteriseerde macro's
Een van de krachtige functies van de CPP is de mogelijkheid om functies te simuleren met behulp van geparametriseerde macro's. We kunnen bijvoorbeeld een code hebben om een getal als volgt kwadratisch te maken −
int square(int x) { return x * x; }
We kunnen de code boven de code als volgt herschrijven met een macro −
#define square(x) ((x) * (x))
Macro's met argumenten moeten worden gedefinieerd met de #define richtlijn voordat ze kunnen worden gebruikt. De argumentenlijst staat tussen haakjes en moet direct achter de macronaam volgen. Spaties zijn niet toegestaan tussen de macronaam en haakjes openen. Bijvoorbeeld −
Live demo#include <stdio.h> #define MAX(x,y) ((x) > (y) ? (x) : (y)) int main(void) { printf("Max between 20 and 10 is %d\n", MAX(10, 20)); return 0; }
Wanneer de bovenstaande code wordt gecompileerd en uitgevoerd, levert dit het volgende resultaat op −
Max between 20 and 10 is 20
C Taal
- C# Hello World - Uw eerste C#-programma
- C#-zoekwoorden en -ID's
- C#-variabelen en (primitieve) gegevenstypen
- C#-operators
- C# Bitsgewijze en Bit Shift-operators
- C# Basisinvoer en -uitvoer
- C#-expressies, statements en blokken (met voorbeelden)
- C# Opmerkingen
- C# switch-instructie
- C# ternair (? :) Operator
- C# break-instructie