Latest web development tutorials

C ++ preprocesora

Niektóre dyrektywy preprocesora, kieruje preprocesor do kompilatora przed faktycznym kompilacji trzeba zakończyć.

Wszystkie dyrektywy preprocesora są (#) zaczynając od krzyżyka, tylko spacja może pojawić się przed dyrektywami preprocesora. dyrektywy preprocesora C ++ nie jest stwierdzenie, więc nie są one średnik; na koniec ().

Widzieliśmy wszystkie poprzednie przypadki mają#include dyrektywy.To makro jest używany plik nagłówka być zawarte w pliku źródłowym.

C ++ obsługuje również szereg dyrektyw preprocesora, takie jak # obejmują #define, # # Jeżeli jeszcze, # linii itp, spójrzmy na tych ważnych instrukcji.

#define przerób

dyrektywa preprocesora #define wykorzystywane do tworzenia stałych symbolicznych. Stała symboliczne jest zazwyczaj nazywanymakro, forma ogólnego polecenia jest następująca:

#define macro-name replacement-text 

Kiedy ta linia kodu pojawiają się w pliku, plik pojawia się kolejna Wszystkie makra zostaną zastąpione zastępczego tekstu, zanim program zostanie skompilowany. Na przykład:

#include <iostream>
using namespace std;

#define PI 3.14159

int main ()
{
 
    cout << "Value of PI :" << PI << endl; 

    return 0;
}

A teraz przetestować ten kod, spojrzeć na wyniki wstępnej obróbki. Załóżmy, że plik źródłowy już istnieje, a następnie użyć opcji -E, aby skompilować i przekierowanie wyników do test.p. Teraz, jeśli spojrzeć test.p plik, widać, że już zawiera wiele informacji, a wartość została zmieniona na dole pliku w następujący sposób:

$gcc -E test.cpp > test.p

...
int main ()
{
 
    cout << "Value of PI :" << 3.14159 << endl; 

    return 0;
}

Funkcje macro

Można użyć #define zdefiniować makro jak następuje z parametrem:

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

Gdy powyższy kod jest kompilowany i wykonany, że daje następujące wyniki:

The minimum is 30

warunkowa kompilacja

Istnieje szereg poleceń, które mogą być stosowane selektywnie na części kodu źródłowego programu są zbierane. Proces ten jest znany jako kompilacji warunkowej.

Struktura i wybrać, czy warunki strukturalne podobnie preprocesora. Rozważmy następujący fragment kodu preprocesora:

#ifndef NULL
   #define NULL 0
#endif

Można dokonać tylko wtedy, gdy skompilowany z debugowania, debugowanie może być realizowana za pomocą makra, co następuje:

#ifdef DEBUG
   cerr <<"Variable x = " << x << endl;
#endif

Jeżeli przed instrukcją #ifdef DEBUG został zdefiniowany symboliczne stałej DEBUG, to będzie na sprawozdaniach Programcerr zebranych.Można użyć #if 0 Wykomentuj części sprawozdania programu, co następuje:

#if 0
   不进行编译的代码
#endif

Spróbujmy następujące przykłady:

#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
   /* 这是注释部分 */
   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;
}

Gdy powyższy kod jest kompilowany i wykonany, że daje następujące wyniki:

Trace: Inside main function
The minimum is 30
Trace: Coming out of main function

# oraz ## operatorów

# ## I operator przerób w C ++ i ANSI / ISO C w jest ona dostępna. # Operator wymiana tokena tekstu zostaną zamienione na łańcuch ujęty w cudzysłów.

Rozważmy następującą definicję makra:

#include <iostream>
using namespace std;

#define MKSTR( x ) #x

int main ()
{
    cout << MKSTR(HELLO C++) << endl;

    return 0;
}

Gdy powyższy kod jest kompilowany i wykonany, że daje następujące wyniki:

HELLO C++

Zobaczmy, jak to działa. Zrozumiałe, C ++ preprocesora następującą linię:

cout << MKSTR(HELLO C++) << endl;

Przekształcony:

cout << "HELLO C++" << endl;

## Operatorzy są używane do łączenia dwóch tokenów. Oto przykład:

#define CONCAT( x, y )  x ## y

Gdy pojawia CONCAT w programie, jego parametry zostaną związane i stosowany do zastąpienia makro. Na przykład, program z CONCAT (Witaj, C ++) został zastąpiony przez "Hello C ++", jak pokazano w poniższych przykładach.

#include <iostream>
using namespace std;

#define concat(a, b) a ## b
int main()
{
   int xy = 100;
   
   cout << concat(x, y);
   return 0;
}

Gdy powyższy kod jest kompilowany i wykonany, że daje następujące wyniki:

100

Zobaczmy, jak to działa. Zrozumiałe, C ++ preprocesora następującą linię:

cout << concat(x, y);

Przekształcony:

cout << xy;

C ++ predefiniowanych makr

C ++ jest w tabeli poniżej pewnych predefiniowanych makr:

描述
__LINE__ 这会在程序编译时包含当前行号。
__FILE__ 这会在程序编译时包含当前文件名。
__DATE__ 这会包含一个形式为 month/day/year 的字符串,它表示把源文件转换为目标代码的日期。
__TIME__ 这会包含一个形式为 hour:minute:second 的字符串,它表示程序被编译的时间。

Spójrzmy na te przykłady makr:

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

Gdy powyższy kod jest kompilowany i wykonany, że daje następujące wyniki:

Value of __LINE__ : 6
Value of __FILE__ : test.cpp
Value of __DATE__ : Feb 28 2011
Value of __TIME__ : 18:52:48