Najlepszy samouczek C preprocesor W 2024 r. W tym samouczku możesz dowiedzieć się Przykłady preprocesor,predefiniowanych makr,operator preprocesor,parametryzowane makro,
CzęśćC preprocesora nie jest kompilator, ale jest to proces sporządzania odrębnego etapu.W skrócie, C preprocesor jest tylko narzędziem zastąpienie tylko tekst, będą instruować kompilator skompilować kompletne obróbki wstępnej przed faktyczną potrzebą. Będziemy preprocesor C (C Preprocessor) w skrócie KPP.
Wszystkie zamówienia są wstępnie procesor ze znakiem krzyżyka (#) na początku. To musi być pierwszym nie-spacja, w celu zwiększenia czytelności, dyrektywy preprocesora powinna rozpocząć się w pierwszej kolumnie. Poniżej wymienione są wszystkie ważne instrukcje pre-processor:
指令 | 描述 |
---|---|
#define | 定义宏 |
#include | 包含一个源代码文件 |
#undef | 取消已定义的宏 |
#ifdef | 如果宏已经定义,则返回真 |
#ifndef | 如果宏没有定义,则返回真 |
#if | 如果给定条件为真,则编译下面代码 |
#else | #if 的替代方案 |
#elif | 如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码 |
#endif | 结束一个 #if……#else 条件编译块 |
#error | 当遇到标准错误时,输出错误消息 |
#pragma | 使用标准化方法,向编译器发布特殊的命令到编译器中 |
Analiza zrozumieć poniższych przykładach różne instrukcje.
#define MAX_ARRAY_LENGTH 20
Dyrektywa ta mówi CPP zastąpić wszystkie MAX_ARRAY_LENGTH 20. Użyj#definedo definiowania stałych w celu zwiększenia czytelności.
#include <stdio.h> #include "myheader.h"
Te instrukcje powiedzieć CPP stdio.h uzyskać zbiblioteki systemowej i dodać tekst do bieżącego pliku źródłowego.Następna linia mówi CPPmyheader.h uzyskać od lokalnego katalogu i dodaj zawartość do bieżącego pliku źródłowego.
#undef FILE_SIZE #define FILE_SIZE 42
Komenda ta mówi CPP anulować FILE_SIZE zdefiniowane i zdefiniować go jako 42.
#ifndef MESSAGE #define MESSAGE "You wish!" #endif
Komenda ta mówi jedynie, gdy CPP KOMUNIKAT niezdefiniowany tylko wtedy, gdy określona WIADOMOŚĆ.
#ifdef DEBUG /* Your debugging statements here */ #endif
Komenda ta mówi CPP jeśli zdefiniujesz debugowania, a następnie wykonuje instrukcję przetwarzania. W czasie kompilacji, jeśli przejdą do przełącznika-DDEBUGkompilator gcc, polecenie to jest przydatne. Definiuje debugowania, zawsze można włączyć lub wyłączyć debugowanie w czasie kompilacji.
ANSI C definiuje liczbę makr. W programowaniu, można użyć tych makr, ale różni się bezpośrednio modyfikować tych predefiniowanych makr.
宏 | 描述 |
---|---|
__DATE__ | 当前日期,一个以 "MMM DD YYYY" 格式表示的字符常量。 |
__TIME__ | 当前时间,一个以 "HH:MM:SS" 格式表示的字符常量。 |
__FILE__ | 这会包含当前文件名,一个字符串常量。 |
__LINE__ | 这会包含当前行号,一个十进制常量。 |
__STDC__ | 当编译器以 ANSI 标准编译时,则定义为 1。 |
Spróbujmy następujące przykłady:
#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__ ); }
Jeżeli powyższy kod (wtest.c pliku) są opracowywane i realizowane, to daje następujące wyniki:
File :test.c Date :Jun 2 2012 Time :03:36:24 Line :8 ANSI :1
C preprocesor udostępnia następujące podmioty, które pomogą Ci stworzyć makra:
Makro jest zwykle napisane na jednej linii. Jednakże, jeśli makro jest zbyt długa, by zmieścić się w jednej linii, użyj kontynuację makro operatora (\). Na przykład:
#define message_for(a, b) \ printf(#a " and " #b ": We love you!\n")
W definicjach makr, gdy trzeba umieścić makro argumentu w ciąg stałej, łańcuch stały operator kwantyzacji (#). Makro stosując operator ma określoną listę parametrów lub parametrów. Na przykład:
#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; }
Gdy powyższy kod jest kompilowany i wykonany, że daje następujące wyniki:
Carole and Debra: We love you!
Reklamowe Operator wklejanie (##) w definicji makra łączy w sobie dwa parametry. Pozwala to dwa niezależne definicja makra znaczniki są połączone w tagu. Na przykład:
#include <stdio.h> #define tokenpaster(n) printf ("token" #n " = %d", token##n) int main(void) { int token34 = 40; tokenpaster(34); return 0; }
Gdy powyższy kod jest kompilowany i wykonany, że daje następujące wyniki:
token34 = 40
Jak to się stało, ponieważ w tym przykładzie będzie produkować następujące rzeczywiste wyjście z kompilatora:
printf ("token34 = %d", token34);
Ten przykład pokazuje, token ## n łączy się token34 tutaj użyliśmystałej łańcuchowej operatora kwantyzacji (#) i wklejanie tokenów operatora (##).
Zdefiniowany operator preprocesora jest stosowany w ciągłym wyrażenie użyte w celu określenia, czy identyfikator został zdefiniowany za pomocą #define.Jeśli określony identyfikator jest już zdefiniowana wartość jest prawdziwe (niezerowe). Jeśli określony identyfikator nie jest zdefiniowana, wartością jest false (zero). Poniższy przykład ilustruje użycie zdefiniowanego operatora ():
#include <stdio.h> #if !defined (MESSAGE) #define MESSAGE "You wish!" #endif int main(void) { printf("Here is the message: %s\n", MESSAGE); return 0; }
Gdy powyższy kod jest kompilowany i wykonany, że daje następujące wyniki:
Here is the message: You wish!
CPP to potężne narzędzie można wykorzystać do symulowania sparametryzowane funkcji makro. Na przykład, następujący kod jest obliczenie kwadratem liczby:
int square(int x) { return x * x; }
Możemy użyć makra przepisać powyższy kod w następujący sposób:
#define square(x) ((x) * (x))
Przed użyciem makr z parametrami,należy użyć dyrektywy #define.Lista parametrów jest w nawiasach, i musi być natychmiast za nazwę makra. Przestrzeń pomiędzy nazwę makra i lewy nawias jest niedozwolone. Na przykład:
#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; }
Gdy powyższy kod jest kompilowany i wykonany, że daje następujące wyniki:
Max between 20 and 10 is 20