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 pl. 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