Przestrzenie nazw
Warianty
Działania

Preprocesor

Z cppreference.com
< cpp


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