logo

C-Präprozessoren

Präprozessoren sind Programme, die den Quellcode vor der Kompilierung verarbeiten. Zwischen dem Schreiben eines Programms und der Ausführung eines Programms in C sind mehrere Schritte erforderlich. Schauen wir uns diese Schritte an, bevor wir tatsächlich anfangen, etwas über Präprozessoren zu lernen.

Präprozessoren in c



Die Zwischenschritte können Sie im obigen Diagramm sehen. Der von Programmierern geschriebene Quellcode wird zunächst in einer Datei, sei es ein Name, gespeichert Programm.c . Diese Datei wird dann von Präprozessoren verarbeitet und eine erweiterte Quellcodedatei mit dem Namen program.i generiert. Diese erweiterte Datei wird vom Compiler kompiliert und eine Objektcodedatei mit dem Namen program.obj generiert. Schließlich verknüpft der Linker diese Objektcodedatei mit dem Objektcode der Bibliotheksfunktionen, um die ausführbare Datei program.exe zu generieren.

Präprozessoranweisungen in C

Präprozessorprogramme stellen Präprozessoranweisungen bereit, die den Compiler anweisen, den Quellcode vor dem Kompilieren vorzuverarbeiten. Alle diese Präprozessoranweisungen beginnen mit einem „#“-Symbol (Hash). Das „#“-Symbol gibt an, dass jede Anweisung, die mit einem „#“ beginnt, zur Ausführung an das Präprozessorprogramm weitergeleitet wird. Wir können diese Präprozessoranweisungen an einer beliebigen Stelle in unserem Programm platzieren.

Beispiele für einige Präprozessoranweisungen sind: #enthalten , #definieren , #ifndef, usw.



Notiz Denken Sie daran, dass die # Das Symbol stellt nur einen Pfad zum Präprozessor bereit und ein Befehl wie „include“ wird vom Präprozessorprogramm verarbeitet. #include fügt beispielsweise den Code oder Inhalt der angegebenen Datei in Ihr Programm ein.

Liste der Präprozessordirektiven in C

Die folgende Tabelle listet alle Präprozessordirektiven in C auf:

Präprozessoranweisungen

Beschreibung



#definieren

Wird zum Definieren eines Makros verwendet

#undef

Wird verwendet, um die Definition eines Makros aufzuheben

#enthalten

Wird verwendet, um eine Datei in das Quellcodeprogramm einzubinden

#ifdef

Wird verwendet, um einen Codeabschnitt einzuschließen, wenn ein bestimmtes Makro durch #define definiert wird

#ifndef

Wird verwendet, um einen Codeabschnitt einzuschließen, wenn ein bestimmtes Makro nicht durch #define definiert ist

#Wenn

Überprüfen Sie den angegebenen Zustand

#anders

Alternativer Code, der ausgeführt wird, wenn #if fehlschlägt

#endif

Wird verwendet, um das Ende von #if, #ifdef und #ifndef zu markieren

Diese Präprozessoren können anhand der Art der von ihnen ausgeführten Funktion klassifiziert werden.

Arten von C-Präprozessoren

Es gibt 4 Haupttypen von Präprozessoranweisungen:

  1. Makros
  2. Dateieinbindung
  3. Bedingte Kompilierung
  4. Andere Richtlinien

Lassen Sie uns nun jede dieser Richtlinien im Detail kennenlernen.

1. Makros

In C sind Makros Codeteile in einem Programm, denen ein Name gegeben wird. Immer wenn der Compiler auf diesen Namen stößt, ersetzt er den Namen durch den tatsächlichen Codeabschnitt. Der '#definieren' Die Direktive wird zum Definieren eines Makros verwendet.

Syntax der Makrodefinition

  #define     token     value>

wobei nach der Vorverarbeitung die Zeichen wird auf seine erweitert Wert im Programm.

Beispiel für ein Makro

C




// C Program to illustrate the macro> #include> // macro definition> #define LIMIT 5> int> main()> {> >for> (>int> i = 0; i printf('%d ', i); } return 0; }>

>

>

Ausgabe

0 1 2 3 4>

Wenn der Compiler im obigen Programm das Wort LIMIT ausführt, ersetzt er es durch 5. Das Wort 'GRENZE' in der Makrodefinition wird als Makrovorlage bezeichnet Und „5“ ist Makroexpansion.

Notiz Am Ende der Makrodefinition steht kein Semikolon (;). Makrodefinitionen benötigen am Ende kein Semikolon.

Es gibt auch welche Vordefinierte Makros in C die bei der Bereitstellung verschiedener Funktionalitäten für unser Programm nützlich sind.

Makros mit Argumenten

Wir können auch Argumente an Makros übergeben. Mit Argumenten definierte Makros funktionieren ähnlich wie Funktionen.

Beispiel

  #define   foo(  a, b  )   a + b  #define func(r) r * r>

Lassen Sie uns dies mit einem Programm verstehen:

C




// C Program to illustrate function like macros> #include> // macro with parameter> #define AREA(l, b) (l * b)> int> main()> {> >int> l1 = 10, l2 = 5, area;> >area = AREA(l1, l2);> >printf>(>'Area of rectangle is: %d'>, area);> >return> 0;> }>

>

>

Ausgabe

Area of rectangle is: 50>

Aus dem obigen Programm können wir ersehen, dass der Compiler jedes Mal, wenn er AREA(l, b) im Programm findet, diese durch die Anweisung (l*b) ersetzt. Darüber hinaus werden die an die Makrovorlage AREA(l, b) übergebenen Werte auch in der Anweisung (l*b) ersetzt. Daher ist AREA(10, 5) gleich 10*5.

2. Dateieinbindung

Diese Art von Präprozessoranweisung weist den Compiler an, eine Datei in das Quellcodeprogramm aufzunehmen. Der #include Präprozessoranweisung wird verwendet, um die Header-Dateien in das C-Programm einzubinden.

Es gibt zwei Arten von Dateien, die der Benutzer in das Programm einbinden kann:

Standard-Header-Dateien

Die Standard-Header-Dateien enthalten Definitionen vordefinierter Funktionen wie printf(), scanf(), usw. Diese Dateien müssen eingebunden werden, um mit diesen Funktionen arbeiten zu können. Unterschiedliche Funktionen werden in unterschiedlichen Header-Dateien deklariert.
Beispielsweise befinden sich Standard-E/A-Funktionen in der Datei „iostream“, während Funktionen, die Zeichenfolgenoperationen ausführen, in der Datei „string“ enthalten sind.

Syntax

  #include   <  file_name>>

Wo Dateiname ist der Name der einzubindenden Header-Datei. Der '' Klammern Weisen Sie den Compiler an, nach der Datei im s zu suchen Standardverzeichnis.

Benutzerdefinierte Header-Dateien

Wenn ein Programm sehr groß wird, empfiehlt es sich, es in kleinere Dateien aufzuteilen und diese bei Bedarf einzubinden. Bei diesen Dateitypen handelt es sich um benutzerdefinierte Header-Dateien.

Syntax

  #include   '  filename  '>

Der Anführungszeichen ( ) Weisen Sie den Compiler an, nach der Header-Datei in zu suchen Verzeichnis der Quelldatei.

3. Bedingte Kompilierung

Bedingte Kompilierung in C-Anweisungen ist eine Art Direktive, die dabei hilft, einen bestimmten Teil des Programms zu kompilieren oder die Kompilierung eines bestimmten Teils des Programms basierend auf bestimmten Bedingungen zu überspringen. Es gibt die folgenden Präprozessoranweisungen, die zum Einfügen von bedingtem Code verwendet werden:

  1. #if-Richtlinie
  2. #ifdef-Direktive
  3. #ifndef-Richtlinie
  4. #else-Direktive
  5. #elif-Richtlinie
  6. #endif-Richtlinie

#endif Die Direktive wird verwendet, um die Eröffnungsdirektiven #if, #ifdef und #ifndef zu schließen, was bedeutet, dass die Vorverarbeitung dieser Direktiven abgeschlossen ist.

Syntax

  #ifdef     macro_name   // Code to be executed if macro_name is defined #  ifndef     macro_name   // Code to be executed if macro_name is not defined   #if    constant_expr   // Code to be executed if constant_expression is true   #elif     another_constant_expr   // Code to be excuted if another_constant_expression is true   #else   // Code to be excuted if none of the above conditions are true   #endif>

Wenn das Makro mit dem Namen „ Makroname ' definiert ist, wird der Anweisungsblock normal ausgeführt. Wenn er jedoch nicht definiert ist, überspringt der Compiler diesen Anweisungsblock einfach.

Beispiel

Das folgende Beispiel zeigt die Verwendung der Präprozessordirektiven #include #if, #elif, #else und #endif.

C




//program to demonstrates the use of #if, #elif, #else,> // and #endif preprocessor directives.> #include> // defining PI> #define PI 3.14159> int> main()> {> > #ifdef PI> >printf>(>'PI is defined '>);> > #elif defined(SQUARE)> >printf>(>'Square is defined '>);> #else> >#error 'Neither PI nor SQUARE is defined'> #endif> > #ifndef SQUARE> >printf>(>'Square is not defined'>);> #else> >cout <<>'Square is defined'> << endl;> #endif> >return> 0;> }>

Java-Ganzzahl
>

>

Ausgabe

PI is defined Square is not defined>

4. Sonstige Richtlinien

Abgesehen von den oben genannten Anweisungen gibt es zwei weitere Anweisungen, die nicht häufig verwendet werden. Diese sind:

  1. #undef-Direktive
  2. #pragma-Richtlinie

1. #undef-Direktive

Die #undef-Direktive wird verwendet, um die Definition eines vorhandenen Makros aufzuheben. Diese Direktive funktioniert wie folgt:

#undef LIMIT>

Durch die Verwendung dieser Anweisung wird die Definition des vorhandenen Makros LIMIT aufgehoben. Nach dieser Anweisung wird jede #ifdef LIMIT-Anweisung als falsch ausgewertet.

Beispiel

Das folgende Beispiel zeigt die Funktionsweise der #undef-Direktive.

C




#include> // defining MIN_VALUE> #define MIN_VALUE 10> int> main() {> >// Undefining and redefining MIN_VALUE> printf>(>'Min value is: %d '>,MIN_VALUE);> > //undefining max value> #undef MIN_VALUE> > // again redefining MIN_VALUE> #define MIN_VALUE 20> >printf>(>'Min value after undef and again redefining it: %d '>, MIN_VALUE);> >return> 0;> }>

>

>

Ausgabe

Min value is: 10 Min value after undef and again redefining it: 20>

2. #pragma-Richtlinie

Diese Direktive ist eine Spezialanweisung und wird zum Aktivieren oder Deaktivieren einiger Funktionen verwendet. Diese Arten von Anweisungen sind Compiler-spezifisch, d. h. sie variieren von Compiler zu Compiler.

Syntax

#pragma   directive>

Einige der #pragma-Anweisungen werden im Folgenden erläutert:

  1. #pragma-Startup: Mithilfe dieser Anweisungen können wir die Funktionen angeben, die vor dem Programmstart ausgeführt werden müssen (bevor die Steuerung an main() übergeht).
  2. #Pragma-Exit : Diese Anweisungen helfen uns, die Funktionen anzugeben, die unmittelbar vor dem Beenden des Programms ausgeführt werden müssen (kurz bevor die Steuerung von main() zurückkehrt).

Das folgende Programm funktioniert nicht mit GCC-Compilern.

Beispiel

Das folgende Programm Veranschaulichen Sie die Verwendung von #Pragma Exit und Pragma Startup

C




// C program to illustrate the #pragma exit and pragma> // startup> #include> void> func1();> void> func2();> // specifying funct1 to execute at start> #pragma startup func1> // specifying funct2 to execute before end> #pragma exit func2> void> func1() {>printf>(>'Inside func1() '>); }> void> func2() {>printf>(>'Inside func2() '>); }> // driver code> int> main()> {> >void> func1();> >void> func2();> >printf>(>'Inside main() '>);> >return> 0;> }>

>

>

Erwartete Ausgabe

Inside func1() Inside main() Inside func2()>

Der obige Code erzeugt die unten angegebene Ausgabe, wenn er auf GCC-Compilern ausgeführt wird:

Inside main()c>

Dies liegt daran, dass GCC das Starten oder Beenden von #pragma nicht unterstützt. Sie können jedoch den folgenden Code für die erwartete Ausgabe auf GCC-Compilern verwenden.

C




#include> void> func1();> void> func2();> void> __attribute__((constructor)) func1();> void> __attribute__((destructor)) func2();> void> func1()> {> >printf>(>'Inside func1() '>);> }> void> func2()> {> >printf>(>'Inside func2() '>);> }> int> main()> {> >printf>(>'Inside main() '>);> >return> 0;> }>

>

>

Ausgabe

Inside func1() Inside main() Inside func2()>

Im obigen Programm haben wir einige verwendet spezifische Syntaxen sodass eine der Funktionen vor der Hauptfunktion und die andere nach der Hauptfunktion ausgeführt wird.

#pragma warn-Richtlinie

Diese Direktive wird verwendet, um die Warnmeldung auszublenden, die während der Kompilierung angezeigt wird. Wir können die Warnungen wie unten gezeigt ausblenden:

  • #pragma warnen -rvl : Diese Direktive verbirgt die Warnungen, die ausgegeben werden, wenn eine Funktion, die einen Wert zurückgeben soll, keinen Wert zurückgibt.
  • #pragma warnen -par : Diese Direktive verbirgt die Warnungen, die ausgegeben werden, wenn eine Funktion die ihr übergebenen Parameter nicht verwendet.
  • #pragma warnen -rch : Diese Direktive verbirgt die Warnungen, die ausgegeben werden, wenn ein Code nicht erreichbar ist. Zum Beispiel jeder Code, der nach dem geschrieben wurde zurückkehren Die Anweisung in einer Funktion ist nicht erreichbar.

Wenn Ihnen techcodeview.com gefällt und Sie einen Beitrag leisten möchten, können Sie auch einen Artikel über schreiben . Sehen Sie, wie Ihr Artikel auf der Hauptseite von techcodeview.com erscheint, und helfen Sie anderen Geeks. Bitte schreiben Sie Kommentare, wenn Sie etwas Falsches finden oder wenn Sie weitere Informationen zu dem oben besprochenen Thema mitteilen möchten.