Stronę tą wyświetlono już: 21290 razy
Dyrektywy preprocesora w C++ są poleceniami, które kompilator wykonuje zanim zacznie on tworzyć kod programu. Dzięki takiemu rozwiązaniu można dość swobodnie sterować tym co zostanie dołączone do kodu źródłowego programu. Wszystkie dyrektywy zaczynają się od znaku #.
Dyrektywa #include
Jest to jedna z podstawowych dyrektyw, która służy do załączania do plików z rozszerzeniem .cpp i .h definicji struktur, klas i nagłówków funkcji zawartych w oddzielnych plikach lub bibliotekach systemowych. Pliki .h mogą być załączane na trzy sposoby:
- poprzez odwołanie się do plików znajdujących się w domyślnej lokalizacji podstawowych plików .h kompilatora, odwołanie takie ma następującą postać przykładową: #include <iostream>
- poprzez odwołanie się do pliku z lokalizacji domyślnej projektu #include "moje_funkcje.h"
- poprzez podanie bezwzględnej ścieżki do pliku, np. #include "C:\\moje_funkcje.h"
Ostatni z sposobów nie jest zbyt często stosowany ani też zalecany.
Dyrektywa #define
Dyrektywa ta jest często stosowana do tworzenia stałych oraz makr. Stałe definiowane są w następujący sposób:
Powyższy kod tworzy stałe w postaci literałów, zanim kod programu zostanie skompilowany kompilator wszędzie tam gdzie wystąpi słowo ST_PI wstawi ciąg znaków 3.141592654 i to samo tyczy się ST_E. Deklarowanie powyżej wypisanych stałych mija się z celem, gdyż wszystkie stałe matematyczne znajdują się w pliku nagłówkowym math.h, aby jednak z nich skorzystać konieczne jest napisanie następującej dyrektywy:
W ten sposób odblokowany zostanie następujący kod znajdujący się w pliku nagłówkowym math.h:
Dyrektywa #define umożliwia również tworzenie własnych makr, bardzo prosty i niezbyt przydatny przykład obrazujący zasadę definiowania makra napisałem poniżej:
Powyżej pokazany został częsty błąd, jaki można popełnić wykorzystując makra tego typu, otóż w przypadku zmiennej int o nazwie b wynikiem będzie 5 a to dlatego, ze kompilator wstawi w miejsce POMNOZ(2 + 1, 3) kod 2 + 1 * 3. Z tego względu należałoby tutaj stworzyć makro następującej postaci:
Niezbyt zgrabne rozwiązanie, ale poprawniejsze składniowo.
Poniżej podaję przykłady standardowych makr:
- __DATE__ - data momentu kompilacji;
- __TIME__ - godzina momentu kompilacji;
- __FILE__ - łańcuch tekstu zawierający nazwę kompilowanego pliku;
- __LINE__ - numer linii w kodzie programu;
UWAGA! Przyjęło się, że wszystkie nazwy stałych i makr są pisane DUŻYMI LITERAMI dla odróżnienia od nazewnictwa zmiennych zawartych w kodzie programu.
Dyrektywa #undef
Dyrektywa ta jest wykorzystywana do usunięcia deklaracji jakiejś zmiennej czy też makra utworzonego dyrektywą #define.
Instrukcja warunkowa #if #elif #else #endif
Tego typu instrukcja umożliwia sterowanie kodem programu, prosty przykład jest:
Wystarczy w jednym miejscu zmienić jedną wartość, aby kod, który zostanie załączony do programu podczas jego kompilacji się zmienił.
Instrukcja warunkowa #ifdef #ifndef #else #endif
Jest to podobny zbiór instrukcji, z tą różnicą że sprawdza on czy dana stała została zadeklarowana, czy też nie. Często wykorzystywanym kodem jest zabezpieczenie przed podwójnym załączaniem pliku nagłówkowego h: