Preprocesor
Preprocesor jest podprogramem uruchamianym tuż przed rozpoczęciem właściwej kompilacji.
Jego zadaniem jest tak sformatowanie źródła aby mogły zostać bez błędów przetworzone przez kompilator - zawierały wszystkie potrzebne deklaracje.
Większość plików źródłowych zawiera powtarzające się odwołania do funkcji/zmiennych/struktur znajdujących się w innych plikach. Aby kompilator wiedział co reprezentuje dana etykieta (nazwa funkcji/zmiennej/struktury), programista musi przynajmniej ją zadeklarować. W tym celu tworzone są pliki nagłówkowe - zwalniają programistę z obowiązku pisania powtarzających się deklaracji.
[edytuj] Dyrektywy
Dyrektywy są poleceniami dla preprocesora, które sterują jego zachowaniem. Posiadają następujący format:
- znak # (musi być pierwszym niebiałym znakiem w linii; nie musi być odzielony odstępem od polecenia)
- polecenie (jedno z: define, undef, include, if, ifdef, ifndef, else, elif, endif, line, error, pragma)
- argumenty (nie zawsze są wymagane - zależnie od polecenia)
Przykładowa dyrektywa może wyglądać następująco:
# include <iostream>
[edytuj] Możliwości
Głównym zadaniem preprocesora jest wstawianie zawartości innych plików, definiowanie makr/stałych, które są następnie (przed kompilacją) zamieniane na faktyczne fragmenty kodu/wartości. Preprocesor może:
- warunkowo włączać/wyłączać fragmenty kodu zawartego w pliku źródłowym (poprzez użycie #if, #ifdef, #ifndef, #else, #elif oraz #endif)
- definiować etykiety oraz makra (poprzez użycie #define i #undef)
- włączać zawartość innych plików (poprzez użycie #include)
- wywoływać ostrzeżenia (poprzez użycie #warning)
- wywoływać błędy kompilacji (poprzez użycie #error)
- zmieniać linie oraz nazwę pliku zgłaszaną do kompilatora (poprzez użycie #line)
W zależności od implementacji (wersji), kompilator (lub preprocesor) może udostępniać dodatkowe opcje. Są one dostępne za pomocą dyrektywy #pragma. Dokumentacja kompilatora powinna zawierać listę oraz opis poleceń wspieranych przez tą dyrektywę.
[edytuj] Lista dyrektyw
# oraz ## | manipuluje łańcuchami znaków |
#define | definiuje stałe lub makra |
#error | wyświetla błąd kompilacji |
#if, #ifdef, #ifndef, #else, #elif, oraz #endif | operatory warunkowe |
#include | wstawia zawartość podanego pliku |
#line | ustawia informacje o linii i pliku |
#pragma | przekazuje dodatkowe polecenia do kompilatora (zachowanie zależy od implementacji) |
#undef | anuluje definicję stałych lub makr |
Zmienne preprocesora | wartości generowane dynamiczne przez preprocesor |