preprocessor directives c
Szczegółowe spojrzenie na dyrektywy preprocesora w C ++.
Preprocesor to unikalna funkcja języka C ++. W C ++ mamy takie kroki jak kompilacja, linkowanie i wykonanie typowego programu. W rzeczywistości mamy wiele innych funkcji w programie C ++, które muszą zostać przetworzone przed przekazaniem programu do kompilacji.
W tym celu wykonywany jest specjalny krok zwany przetwarzaniem wstępnym. Wstępne przetwarzanie jest przeprowadzane przed procesem kompilacji, a specjalne funkcje są wstępnie przetwarzane. W rezultacie otrzymujemy rozszerzony program w C ++, a następnie przekazywany jest on do kompilatora.
=> Odwiedź tutaj, aby nauczyć się C ++ od podstaw.
Czego się nauczysz:
- Przegląd
- Dyrektywy dołączania plików
- Dyrektywy makro definicji
- Dyrektywy warunkowej kompilacji
- Operatory # & ##
- Inne dyrektywy
- Predefiniowane makra
- Wniosek
- rekomendowane lektury
Przegląd
Specjalne funkcje przetwarzania wstępnego są identyfikowane za pomocą jednostki o nazwie „Dyrektywa preprocesora”. Te dyrektywy preprocesora informują kompilator, że pewne informacje w programie C ++ oznaczone dyrektywami preprocesora muszą zostać wstępnie przetworzone przed kompilacją.
Zauważ, że w C ++ wszystkie dyrektywy preprocesora zaczynają się od symbolu „#”. W momencie, gdy preprocesor (część kompilatora) napotka symbol #, informacje następujące po symbolu # są wstępnie przetwarzane przed przekazaniem programu do kompilatora.
W przeciwieństwie do innych instrukcji C ++, dyrektywy preprocesora nie kończą się średnikiem.
W tym samouczku zbadamy różne dyrektywy preprocesora obsługiwane przez C ++.
Dyrektywy dołączania plików
#zawierać
Dyrektywa dołączania plików #include umożliwia nam dołączanie innych plików do naszego programu źródłowego. Używając tych funkcji, możemy dołączyć do naszego programu dowolny plik nagłówkowy, który zawiera definicje różnych predefiniowanych funkcji. Możemy dołączyć pliki nagłówkowe do naszego programu, używając następującej składni.
#include
Przykład: #zawierać
Widzieliśmy to już w naszych programach C ++. Nagłówek iostream zawiera funkcje wymagane do przesyłania strumieniowego danych wejściowych / wyjściowych, takie jak cout, cin itp.
W miarę jak nasze programy rosną lub ich funkcjonalność staje się złożona, możemy chcieć podzielić nasz program na różne pliki lub zaimportować funkcje z innych plików. W tym przypadku korzystamy z plików zdefiniowanych przez użytkownika. Aby dołączyć pliki zdefiniowane przez użytkownika do naszego programu, możemy skorzystać z następującej składni dyrektywy #include.
#include “filename”
Przykład: #include „vector_int.h”
Jest to plik nagłówkowy zdefiniowany przez użytkownika, który zamierzamy dołączyć do naszego programu, aby móc korzystać z jego funkcjonalności.
Poniższy przykład kodu pokazuje użycie dyrektywy #include.
jak stworzyć nowy projekt java w eclipse
#include using namespace std; int main() { cout<<'This is an example demonstrating inclusion directive #include'; }
Wynik:
To jest przykład demonstrujący dyrektywę włączenia #include.
Jak pokazano, użyliśmy dyrektywy #include, aby dołączyć funkcjonalność nagłówka do naszego programu.
Dyrektywy makro definicji
#definiować
Dyrektywa #define służy do definiowania stałych symbolicznych lub makr w programie w języku C ++.
Ogólna postać dyrektywy #define to:
#define macro_name replacement code
Gdy preprocesor napotka makro w programie, zastępuje to makro kodem zdefiniowanym za pomocą dyrektywy #define, zanim kod zostanie przekazany do kompilatora.
Poniższy przykład kodu przedstawia symboliczną stałą RADIUS zdefiniowaną za pomocą dyrektywy #define i jej użycie w programie.
#include #define RADIUS 5 using namespace std; int main() { cout<<'Area of a circle : '<<3.142 * RADIUS * RADIUS; }
Wynik:
Powierzchnia koła: 78,55
Jak pokazano w programie, możemy skorzystać w naszym kodzie ze stałej symbolicznej RADIUS i zostanie ona zastąpiona wartością zdefiniowaną dla niej za pomocą dyrektywy #define.
pytania i odpowiedzi na rozmowę z analitykiem ds. zapewnienia jakości
Możemy użyć dyrektywy #define, aby zdefiniować odpowiedni kod funkcji. Te funkcje są zwykle małymi funkcjami.
Przykład jest pokazany poniżej.
#include #define REC_AREA(length, breadth) (length * breadth) using namespace std; int main() { int length = 20, breadth = 5, area; area = REC_AREA(length, breadth); cout << 'Area of a rectangle is: ' << area; return 0; }
Wynik:
Pole prostokąta to: 100
Tutaj za pomocą dyrektywy #define zdefiniowaliśmy funkcję REC_AREA, która przyjmuje dwa argumenty, tj. Długość i szerokość i oblicza pole prostokąta. W funkcji głównej po prostu korzystamy z tego makra i podajemy mu dwa argumenty, aby otrzymać pole prostokąta.
#undef
Makra w programie zdefiniowanym za pomocą dyrektywy #define trwają, dopóki nie zostaną zdefiniowane za pomocą dyrektywy #undef. Gdy program napotka #undef, kolejne użycie makra (niezdefiniowane przez #undef) spowoduje błąd kompilacji.
W powyższym programie, jeśli po deklaracjach liczb całkowitych podamy po prostu instrukcję #undef REC_AREA, to program zwróci błąd kompilacji.
Dyrektywy warunkowej kompilacji
Oprócz dyrektyw wyjaśnionych powyżej, C ++ udostępnia również następujące dyrektywy, których można użyć do warunkowej kompilacji kodu. Te dyrektywy mogą być używane w podobnych wierszach instrukcji if-else języka C ++.
Na przykład, możemy ustawić DEBUG dla programu na ON lub OFF używając tych warunkowych dyrektyw.
Niektóre z dyrektyw kompilacji warunkowej udostępnionych w C ++ obejmują:
- #gdyby
- #elif
- #endif
- #ifdef
- #ifndef
- #jeszcze
Poniższy program demonstruje użycie dyrektyw kompilacji warunkowej w programie C ++.
#include using namespace std; #define DEBUG #define MAX(a,b) (((a)>(b)) ? a : b) int main () { int i, j; i = 100; j = 50; #ifdef DEBUG cout <<'Trace: Start of main function' << endl; #endif cout <<'The maximum is ' << MAX(i, j) << endl; #undef MAX //cout <<'The maximum is ' << MAX(10,20) << endl; #ifdef DEBUG cout <<'Trace: End of main function' << endl; #endif return 0; }
Wynik:
Ślad: początek funkcji głównej
Maksymalna liczba to 100
Ślad: koniec głównej funkcji
W powyższym programie używamy dyrektywy #ifdef - #endif aby zdefiniować DEBUG dla programu. Następnie niezdefiniowaliśmy funkcję makra MAX za pomocą dyrektywy #undef. Dyrektywa kompilacji warunkowej konstruuje #ifdef - #endif sprawdza, czy ustawiono DEBUG i jeśli jest ustawione, wypisuje kilka komunikatów w programie.
Operatory # & ##
Operatory # i ## to dwa specjalne operatory, które są używane odpowiednio do konwersji tokenu tekstowego na ciąg do wyświetlenia i łączenia dwóch tokenów.
Poniżej podano przykład ilustrujący oba te operatory.
#include using namespace std; #define MKSTR( x ) #x #define concat(a, b) a ## b int main () { cout <<'MKSTR(Hello World) = '<< MKSTR(Hello World) << endl; int xy = 100; cout <<'concat(x,y) = '< Wynik:
MKSTR (Hello World) = Hello World
concat (x, y) = 100
W powyższym programie definiujemy MKSTR z argumentem x. Ma body #x. Kiedy drukujemy ten MKSTR przy użyciu argumentu „Hello World”, widzimy, że z powodu #x argument jest konwertowany na łańcuch i wyświetlany na wyjściu.
przykłady testów białoskrzynkowych
Następnie zdefiniowaliśmy funkcję concat z dwoma argumentami a i b. W treści określamy a ## b. Wyrażenie a ## b równa się ab. Zatem w funkcji głównej, gdy wywołujemy concat (x, y), w rzeczywistości zwraca ona wartość xy, która jest równa zmiennej całkowitej, którą zdefiniowaliśmy.
Inne dyrektywy
#błąd
Ogólna składnia dyrektywy #error to:
#error error_message
Gdy kompilator napotka dyrektywę #error, wyświetla komunikat error_message i kompilacja zostaje zatrzymana. Argument komunikat_błędu może zawierać jedno lub więcej słów z cudzysłowami lub bez.
#linia
To mówi kompilatorowi, aby zmienił przechowywany wewnętrznie numer linii kompilatora i nazwę pliku na podany numer linii i nazwę pliku.
#linia sekwencja cyfr („nazwa pliku”)
Cyfra_sekwencja może być stałą całkowitą.
Przykład:#line 200 test.c
W powyższym przykładzie wewnętrznie przechowywany numer linii jest ustawiony na 200, a nazwa pliku zostaje zmieniona na test. C.
#pragma
Dostarcza instrukcje zdefiniowane przez implementację do kompilatora. Te instrukcje są specyficzne dla kompilatora i platformy. Jeśli instrukcja nie pasuje, dyrektywa jest ignorowana bez generowania błędu składniowego.
Predefiniowane makra
C ++ definiuje również wiele predefiniowanych makr, które mogą być używane przez programistów.
Niektóre z tych makr przedstawiono poniżej w tabeli.
Predefiniowane makro Opis __PLIK__ Bieżąca nazwa pliku kompilowanego programu __DATA__ Data tłumaczenia kodu źródłowego na kod wynikowy w formacie miesiąc / dzień / rok __CZAS__ Czas w formularzu godzina: minuta: sekunda, w której program jest kompilowany __LINIA__ Bieżący numer wiersza programu, który jest kompilowany __cplusplus Stała całkowita, która jest zdefiniowana dla każdej wersji kompilatora
Poniższy program demonstruje te makra w programie.
#include using namespace std; int main () { cout<<'__LINE__ :' << __LINE__ << endl; cout<<'__FILE__ :' << __FILE__ << endl; cout<<'__DATE__ :' << __DATE__ << endl; cout<<'__TIME__ :' << __TIME__ << endl; cout<<'__cplusplus:'<<__cplusplus< Wynik:
__LINE__: 5
__FILE__: prog.cpp
__DATE__: 15 kwietnia 2019 r
__CZAS__: 12: 09: 15
__cplusplus: 201402
Powyższe dane wyjściowe programu są zgodne z powyższym wyjaśnieniem wstępnie zdefiniowanych makr i są oczywiste.
Wniosek
W tym samouczku widzieliśmy różne dyrektywy preprocesora dostarczone przez C ++ wraz z ich przykładami. Dyrektywy preprocesora pomagają nam w pewnym stopniu pisać bardziej wydajne programy i bardziej czytelne programy.
Dyrektywy kompilacji warunkowej pozwalają nam również rozgałęziać wyjście programu na różne sposoby.
=> Poszukaj całej serii szkoleń C ++ tutaj.
rekomendowane lektury
- Testowanie oprogramowania Pomoc Program afiliacyjny!
- Pisz i zarabiaj - program dla doświadczonych testerów zapewniania jakości
- Samouczek potoków w systemie Unix: Potoki w programowaniu w systemie Unix
- Funkcje biblioteczne w C ++
- 70+ NAJLEPSZYCH samouczków C ++ do nauki programowania w C ++ ZA DARMO
- Argumenty wiersza poleceń w C ++
- Iteratory w STL
- Listy inicjalizujące w C ++