Latest web development tutorials

C preprocesor

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使用标准化方法,向编译器发布特殊的命令到编译器中

Przykłady preprocesor

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.

predefiniowanych makr

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

operator preprocesor

C preprocesor udostępnia następujące podmioty, które pomogą Ci stworzyć makra:

Kontynuacja makro operatora (\)

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")

Operator literały łańcuchowe kwantyzacji (#)

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 (##)

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 ()

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!

parametryzowane makro

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