Latest web development tutorials

C-Präprozessor

Ein Teil desC - Präprozessorist nicht der Compiler, aber es ist der Prozess einen separaten Schritt der Erstellung. Kurz gesagt, ist C-Präprozessor nur eine Textersetzung Tool nur, sie den Compiler anweisen wird vollständige Vorbehandlung vor dem tatsächlichen Bedarf zu kompilieren. Wir werden C-Präprozessor (C Preprocessor) abgekürzt als CPP.

Alle Aufträge sind Pre-Prozessor mit einem Nummernzeichen (#) am Anfang. Es ist der erste nicht-leeren Zeichen sein, um die Lesbarkeit zu verbessern, Präprozessordirektiven sollte in der ersten Spalte beginnen. Im Folgenden sind alle wichtigen Pre-Prozessor Anweisungen:

指令描述
#define定义宏
#include包含一个源代码文件
#undef取消已定义的宏
#ifdef如果宏已经定义,则返回真
#ifndef如果宏没有定义,则返回真
#if如果给定条件为真,则编译下面代码
#else#if 的替代方案
#elif如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码
#endif结束一个 #if……#else 条件编译块
#error当遇到标准错误时,输出错误消息
#pragma使用标准化方法,向编译器发布特殊的命令到编译器中

Beispiele für Vorprozessor

Analyse werden die folgenden Beispiele verschiedene Anweisungen zu verstehen.

#define MAX_ARRAY_LENGTH 20

Diese Direktive teilt CPP alle MAX_ARRAY_LENGTH 20 zu ersetzen. Verwenden Sie#defineKonstanten definieren die Lesbarkeit zu verbessern.

#include <stdio.h>
#include "myheader.h"

Diese Anweisungen geben dem CPP stdio.h aus derSystembibliothek zu erhalten,und fügen Sie Text der aktuellen Quelldatei. Die nächste Zeile sagt CPPmyheader.h aus dem lokalen Verzeichnis erhalten und den Inhalt der aktuellen Quelldatei hinzuzufügen.

#undef  FILE_SIZE
#define FILE_SIZE 42

Mit diesem Befehl wird CPP Abbrechen FILE_SIZE definiert, und definieren es als 42.

#ifndef MESSAGE
   #define MESSAGE "You wish!"
#endif

Mit diesem Befehl wird CPP nur, wenn MESSAGE nur unbestimmt, wenn MESSAGE definiert.

#ifdef DEBUG
   /* Your debugging statements here */
#endif

Mit diesem Befehl wird CPP, wenn Sie DEBUG definieren, dann Verarbeitung Anweisung führt. Beim Kompilieren, wenn Sie-DDEBUGSchalter auf gcc - Compiler übergeben, ist dieser Befehl nützlich. Es definiert DEBUG, können Sie immer einschalten oder das Debuggen während der Kompilierung auszuschalten.

Vordefinierte Makros

ANSI C definiert eine Anzahl von Makros. Bei der Programmierung können Sie diese Makros verwenden, aber anders als direkt diese vordefinierten Makros ändern.

描述
__DATE__当前日期,一个以 "MMM DD YYYY" 格式表示的字符常量。
__TIME__当前时间,一个以 "HH:MM:SS" 格式表示的字符常量。
__FILE__这会包含当前文件名,一个字符串常量。
__LINE__这会包含当前行号,一个十进制常量。
__STDC__当编译器以 ANSI 标准编译时,则定义为 1。

Lassen Sie uns die folgenden Beispiele versuchen:

#include <stdio.h>

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__ );

}

Wenn der obige Code (in der Dateitest.c) kompiliert und ausgeführt wird , erzeugt es die folgenden Ergebnisse:

File :test.c
Date :Jun 2 2012
Time :03:36:24
Line :8
ANSI :1

Preprocessor Betreiber

C-Präprozessor bietet die folgenden Operatoren Sie ein Makro helfen zu erstellen:

Die Fortsetzung der Makro-Operator (\)

Ein Makro ist in der Regel auf einer einzigen Zeile geschrieben. Wenn jedoch das Makro zu lang ist, in einer einzigen Zeile zu passen, verwenden Sie die Fortsetzung der Makro-Operator (\). Zum Beispiel:

#define  message_for(a, b)  \
    printf(#a " and " #b ": We love you!\n")

Stringliterale Quantisierung Operator (#)

Bei Makrodefinitionen, wenn Sie ein Makro-Argument in einen String-Konstante, die String-Konstante Quantisierung Operator (#) setzen müssen. Makro mit der Bediener einen bestimmten Parameter oder Parameterliste. Zum Beispiel:

#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;
}

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt es die folgenden Ergebnisse:

Carole and Debra: We love you!
Token Einfügen Operator (##)

Token Einfügen Operator (##) innerhalb der Definition des Makros werden die beiden Parameter zusammenführen. Es erlaubt zwei unabhängige Makro-Definition-Tags in einem Tag kombiniert werden. Zum Beispiel:

#include <stdio.h>

#define tokenpaster(n) printf ("token" #n " = %d", token##n)

int main(void)
{
   int token34 = 40;
   
   tokenpaster(34);
   return 0;
}

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt es die folgenden Ergebnisse:

token34 = 40

Dies ist, wie es passiert ist, weil dieses Beispiel die folgenden aktuellen Ausgabe des Compilers erzeugen wird:

printf ("token34 = %d", token34);

In diesem Beispiel wird das Token zeigt ## n verbindet hier zu token34, verwendeten wir dieString - Konstante Quantisierung Operator (#)undToken-Einfügen-Operator (##).

() definiert Betreiber

Definiert Präprozessor Operator wird in einem konstanten Ausdruck verwendet , um zu bestimmen , ob ein Identifikator definiert ist , die #define verwenden.Wenn die angegebene ID bereits definiert ist, ist der Wert true (nicht Null). Wenn die angegebene Kennung nicht definiert ist, ist der Wert falsch (Null). Das folgende Beispiel zeigt die definierte Operator () Nutzung:

#include <stdio.h>

#if !defined (MESSAGE)
   #define MESSAGE "You wish!"
#endif

int main(void)
{
   printf("Here is the message: %s\n", MESSAGE);  
   return 0;
}

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt es die folgenden Ergebnisse:

Here is the message: You wish!

Parameterized Makro

CPP ist eine leistungsstarke Funktion verwendet werden kann parametrisiert Makrofunktion zu simulieren. Beispielsweise ist der folgende Code das Quadrat einer Zahl zu berechnen:

int square(int x) {
   return x * x;
}

Wir können ein Makro verwenden, um die oben genannten Code neu zu schreiben, wie folgt:

#define square(x) ((x) * (x))

Bevor Makros mit Parametern verwenden, müssen Sieeine # define - Direktive verwenden.Parameterliste ist in Klammern eingeschlossen und müssen unmittelbar hinter dem Makronamen sein. Ein Raum zwischen dem Makronamen und der linken Klammer ist nicht erlaubt. Zum Beispiel:

#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;
}

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt es die folgenden Ergebnisse:

Max between 20 and 10 is 20