Wtorek 06 Maj 2025r. Godz 00:00:00      
Postów: 251      

Dyrektywy preprocesora C++

Preprocesor jest to program wywoływany bezpośrednio przed uruchomieniem kompilatora. Przetwarza on tak zwane dyrektywy.
Ten problem jest związany bezpośrednio z plikami nagłówkowymi. Posiadają one rozszerzenie "*.h". Pliki nagłówkowe stają się częścią tekstu kodu programu w chwili wystąpienia dyrektywy include.
W plikach nagłówkowych umieszcza się deklarację funkcji i definicje struktur, klas i wyliczeń. Dlaczego w plikach nagłówkowych. Dlatego że kompilator potrzebuje definicje, lub deklarację funkcji, klas... przed odwołaniem się do danej funkcji, klasy... Zakładam że nasz jakiś projekt składa się z kilkunastu plików. Można na początku każdego pliku wpisać deklaracje, ale jeżeli coś zmienimy w definicji, to musimy zmieniać definicje w kilkunastu plikach!!! Prościej jest użyć dyrektywy include i zmieniać tyko raz w jednym miejscu. Dyrektywy można stosować w kodzie, czyli w plikach *.cpp, ale w nich stosuje się przeważnie tylko include i define.
Każda dyrektywa zaczyna się tak zwanym chaszem - #. Przez to preprocesor odróżnia kod, od dyrektyw. Zakończeniem dyrektywy jest znak zakończenia linii (ENTER), i średnik nie jest wymagany.

Istnieją następujące dyrektywy (tu opisane :-):
 

  • #include
  • #define
  • #ifdef
  • #ifndef
  • #endif
  • #else
  • #pragma

 

#include

Jest to dyrektywa która dołącza tekst z jakiegoś pliku w miejsce wystąpienia tej dyrektywy. Dyrektywa ta wymaga jednego parametru. Jest nim nazwa pliku który dołączmy plus ewentualnie katalog. Dołącza się przeważnie pliki nagłówkowe, ale nie tylko. Nazwa pliku może być podana w dwojaki sposób. W nawiasach kątowych < > lub w cudzysłowach " ". Dwa rodzaje zapisu ma dwojakie znaczenie.
Jeżeli nazwa pliku wystąpi w nawiasach kątowych to preprocesor wie że plik znajduje się w domyślym katalogu kompilatora z plikami nagłówkowymi, i tam szuka takiego pliku. Przeważnie jest to katalog który nazywa się INCLUDE w katalogu gdzie mamy zainstalowany kompilator.
Jeżeli wystąpią cudzysłowa to preprocesor szuka pliku w katalogu gdzie robiony jest projekt.
Przykłady:
#include <iostream.h>;
#include "mojplik.h";

#define

Dyrektywa ta służy do definiowania zmiennych globalnych. Taka zmienna może ale nie musi posiadać wartości. Jest to wykorzystywane przy nazywaniu pewnych części plików nagłówkowych, lub nadawaniu jakiś wartości zmiennym żeby nie było trzeba było szukać ich w programie. Do nazewnictwa używa się raczej dużych liter. Zapewne będę tego używał w przykładowych programach.
Przykłady:
#define __PLIK_H__
#define DWA 2
W ostatnim przykładzie przypisaliśmy zmiennej wartość 2;

#ifdef

Jest to dyrektywa warunkowa. Sprawdza czy jest zdefiniowana zmienna o określonej nazwie. Jeżeli tak to wykonuje kod aż do wystąpienia dyrektywy #endif. Służy ona do sprawdzania dla jakiego systemu jest program kompilowany, oraz dla zabezpieczenia przed podwójnym zadeklarowaniem klas, zmiennych, funkcji. Jak chyba łatwo zauważyć w moich przykładach każdy plik jest w ten sposób zabezpieczony.
Przykłady:
#ifdef DEFINICJA
//jakiś kod
#endif

#ifndef

Ta dyrektywa działa podobnie jak powyższa z tym że wykonywany jest kod jeżeli zmienna nie została zdefiniowana.
Przykłady:
#ifndef DEFINICJA
//jakiś kod
#endif

#endif

Dyrektywa ta kończy obie powyższe instrukcje warunkowe.
Podczas kompilowania jeżeli wyskoczy błąd że w jakimś pliku *.h nie może znaleźć końca pliku, to warto sprawdzić ilość tych dyrektyw. Musi ona być dokładnie taka sama jak ilość Dyrektyw warunkowych. Przykłady są powyżej.

#else

Ta dyrektywa ma takie samo znaczenie jak instrukcja else przy if. Musi ona występować po którejś dyrektywie warunkowej. Wykonywana jest jeżeli warunek dyrektywy warunkowej nie jest spełniony.
Przykład:
#ifdef DEFINICJA
//jakiś kod
#else #define DEFINICJA #endif

#pragma

Dyrektywy te służą do sterowania preprocesorem. Nie będę ich opisywał bo ich nie sprawdzałem, a nie chcę przepisywać książek. Dla początkującego programisty nie są one niezbędne. Jak na razie nie jestem zmuszony do ich wykorzystania.