C++ Präprozessor
Die Präprozessoren sind die Direktiven, die dem Compiler Anweisungen geben, die Informationen vorzuverarbeiten, bevor die eigentliche Kompilierung beginnt.
Alle Präprozessordirektiven beginnen mit #, und vor einer Präprozessordirektive in einer Zeile dürfen nur Leerzeichen stehen. Präprozessordirektiven sind keine C++-Anweisungen, daher enden sie nicht mit einem Semikolon (;).
Sie haben bereits ein #include gesehen Richtlinie in allen Beispielen. Dieses Makro wird verwendet, um eine Header-Datei in die Quelldatei einzufügen.
Es gibt eine Reihe von Präprozessordirektiven, die von C++ unterstützt werden, wie #include, #define, #if, #else, #line usw. Sehen wir uns wichtige Direktiven an −
Der #define Präprozessor
Die Präprozessordirektive #define erstellt symbolische Konstanten. Die symbolische Konstante wird als Makro bezeichnet und die allgemeine Form der Direktive ist −
#define macro-name replacement-text
Wenn diese Zeile in einer Datei erscheint, werden alle nachfolgenden Vorkommen von Makros in dieser Datei durch Ersetzungstext ersetzt, bevor das Programm kompiliert wird. Zum Beispiel −
#include <iostream> using namespace std; #define PI 3.14159 int main () { cout << "Value of PI :" << PI << endl; return 0; }
Lassen Sie uns nun die Vorverarbeitung dieses Codes durchführen, um das Ergebnis anzuzeigen, vorausgesetzt, wir haben die Quellcodedatei. Lassen Sie uns es also mit der Option -E kompilieren und das Ergebnis auf test.p umleiten. Wenn Sie jetzt test.p überprüfen, enthält es viele Informationen und unten finden Sie den Wert, der wie folgt ersetzt wird −
$gcc -E test.cpp > test.p ... int main () { cout << "Value of PI :" << 3.14159 << endl; return 0; }
Funktionsähnliche Makros
Sie können #define verwenden, um ein Makro zu definieren, das folgende Argumente akzeptiert −
Live-Demo#include <iostream> using namespace std; #define MIN(a,b) (((a)<(b)) ? a : b) int main () { int i, j; i = 100; j = 30; cout <<"The minimum is " << MIN(i, j) << endl; return 0; }
Wenn wir den obigen Code kompilieren und ausführen, würde dies das folgende Ergebnis erzeugen −
The minimum is 30
Bedingte Kompilierung
Es gibt mehrere Direktiven, die verwendet werden können, um ausgewählte Teile des Quellcodes Ihres Programms zu kompilieren. Dieser Vorgang wird bedingte Kompilierung genannt.
Das konditionale Präprozessorkonstrukt ist der „if“-Auswahlstruktur sehr ähnlich. Betrachten Sie den folgenden Präprozessorcode −
#ifndef NULL #define NULL 0 #endif
Sie können ein Programm zu Debugging-Zwecken kompilieren. Sie können das Debugging auch mit einem einzelnen Makro wie folgt ein- oder ausschalten −
#ifdef DEBUG cerr <<"Variable x = " << x << endl; #endif
Dies verursacht den cerr im Programm zu kompilierende Anweisung, wenn die symbolische Konstante DEBUG vor der Direktive #ifdef DEBUG definiert wurde. Sie können die Anweisung #if 0 verwenden, um einen Teil des Programms wie folgt auszukommentieren −
#if 0 code prevented from compiling #endif
Versuchen wir das folgende Beispiel −
Live-Demo#include <iostream> using namespace std; #define DEBUG #define MIN(a,b) (((a)<(b)) ? a : b) int main () { int i, j; i = 100; j = 30; #ifdef DEBUG cerr <<"Trace: Inside main function" << endl; #endif #if 0 /* This is commented part */ cout << MKSTR(HELLO C++) << endl; #endif cout <<"The minimum is " << MIN(i, j) << endl; #ifdef DEBUG cerr <<"Trace: Coming out of main function" << endl; #endif return 0; }
Wenn wir den obigen Code kompilieren und ausführen, würde dies das folgende Ergebnis erzeugen −
The minimum is 30 Trace: Inside main function Trace: Coming out of main function
Die Operatoren # und ##
Die #- und ##-Präprozessoroperatoren sind in C++ und ANSI/ISO C verfügbar. Der #-Operator bewirkt, dass ein Ersetzungstext-Token in eine von Anführungszeichen umgebene Zeichenfolge konvertiert wird.
Betrachten Sie die folgende Makrodefinition −
Live-Demo#include <iostream> using namespace std; #define MKSTR( x ) #x int main () { cout << MKSTR(HELLO C++) << endl; return 0; }
Wenn wir den obigen Code kompilieren und ausführen, würde dies das folgende Ergebnis erzeugen −
HELLO C++
Lassen Sie uns sehen, wie es funktioniert hat. Es ist einfach zu verstehen, dass der C++-Präprozessor die Linie umdreht −
cout << MKSTR(HELLO C++) << endl;
Die obige Zeile wird in die folgende Zeile umgewandelt −
cout << "HELLO C++" << endl;
Der ##-Operator wird verwendet, um zwei Token zu verketten. Hier ist ein Beispiel −
#define CONCAT( x, y ) x ## y
Wenn CONCAT im Programm erscheint, werden seine Argumente verkettet und verwendet, um das Makro zu ersetzen. Beispielsweise wird CONCAT(HELLO, C++) im Programm wie folgt durch „HELLO C++“ ersetzt.
Live-Demo#include <iostream> using namespace std; #define concat(a, b) a ## b int main() { int xy = 100; cout << concat(x, y); return 0; }
Wenn wir den obigen Code kompilieren und ausführen, würde dies das folgende Ergebnis erzeugen −
100
Lassen Sie uns sehen, wie es funktioniert hat. Es ist einfach zu verstehen, dass der C++-Präprozessor −
umwandeltcout << concat(x, y);
Die obige Zeile wird in die folgende Zeile umgewandelt −
cout << xy;
Vordefinierte C++-Makros
C++ bietet eine Reihe von vordefinierten Makros, die unten erwähnt werden −
Sr.No | Makro &Beschreibung |
---|---|
1 | __LINE__ Enthält die aktuelle Zeilennummer des Programms, wenn es kompiliert wird. |
2 | __DATEI__ Diese enthält den aktuellen Dateinamen des Programms, wenn es kompiliert wird. |
3 | __DATUM__ Diese enthält einen String der Form Monat/Tag/Jahr, der das Datum der Übersetzung der Quelldatei in Objektcode darstellt. |
4 | __TIME__ Diese enthält einen String der Form Stunde:Minute:Sekunde, der die Zeit darstellt, zu der das Programm kompiliert wurde. |
Sehen wir uns ein Beispiel für alle oben genannten Makros an −
Live-Demo#include <iostream> using namespace std; int main () { cout << "Value of __LINE__ : " << __LINE__ << endl; cout << "Value of __FILE__ : " << __FILE__ << endl; cout << "Value of __DATE__ : " << __DATE__ << endl; cout << "Value of __TIME__ : " << __TIME__ << endl; return 0; }
Wenn wir den obigen Code kompilieren und ausführen, würde dies das folgende Ergebnis erzeugen −
Value of __LINE__ : 6 Value of __FILE__ : test.cpp Value of __DATE__ : Feb 28 2011 Value of __TIME__ : 18:52:48
C Sprache