Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> C Sprache

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 −

umwandelt
cout << 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

  1. C#-Präprozessordirektiven
  2. C++-Datentypen
  3. C++-Operatoren
  4. C++-Kommentare
  5. C++-Konstruktoren
  6. C++-Klassenvorlagen
  7. C - Präprozessoren
  8. C++-Übersicht
  9. C++ Konstanten/Literale
  10. Operatoren in C++