preprocessor (tsz. preprocessors)
A C++ előfeldolgozója (preprocessor
) egy olyan mechanizmus, amely még a fordítás előtt feldolgozza a kódot. Az előfeldolgozó direktívák (#
jellel kezdődnek) olyan utasítások, amelyeket a fordító még a kód lefordítása előtt végrehajt.
## 1. Az előfeldolgozó működése Az előfeldolgozó direktívák |
✔ Beépítenek fájlokat (#include ) ✔ Makrókat definiálnak (#define ) ✔ Feltételes fordítást biztosítanak (#ifdef , #ifndef , #if , stb.) ✔ Egyéb fordítás előtti műveleteket végeznek
|
Ezek nem C++ utasítások, hanem előfeldolgozó utasítások, amelyeket a fordító a forráskód lefordítása előtt dolgoz fel. |
#include
– Fejlécfájlok beillesztéseA #include
direktíva segítségével más fájlok tartalmát illeszthetjük be a programba.
#include <iostream> // Beépített C++ könyvtár
#include <cmath> // Matematikai függvények
#include "sajatfajl.h" // Saját fájl beillesztése
🔹 A ""
idézőjelek saját fájlokat keresnek az aktuális könyvtárban, míg <>
jelek a rendszerkönyvtárban keresnek.
#define
– Makrók létrehozásaA #define
direktíva lehetővé teszi konstansok és egyszerű szövegcserék definiálását.
#define PI 3.14159
int main() {
double sugar = 5.0;
double korTerulet = PI * sugar * sugar;
std::cout << "A kör területe: " << korTerulet << std::endl;
return 0;
}
🔹 A fordító a PI
szót mindenhol 3.14159
-re cseréli.
#define NEGYZET(x) ((x) * (x)) // Paraméteres makró
int main() {
std::cout << "5 négyzete: " << NEGYZET(5) << std::endl;
return 0;
}
🔹 A NEGYZET(5)
a fordítás előtt ((5) * (5))
-re cserélődik.
#if
, #ifdef
, #ifndef
)Bizonyos részeket feltételesen fordíthatunk le a következő direktívákkal:
Direktíva | Leírás |
---|---|
#if
|
Ha a feltétel igaz, akkor a kód lefordul |
#ifdef
|
Ha a makró definiálva van, akkor a kód lefordul |
#ifndef
|
Ha a makró nincs definiálva, akkor a kód lefordul |
#else
|
Az #if / #ifdef / #ifndef ellenkezője
|
#elif
|
Több feltétel esetén használható (mint else if )
|
#endif
|
Lezárja a feltételes fordítást |
#ifdef
és #ifndef
#define DEBUG // Ha ez nincs megadva, az alatta lévő kód nem fordul le
#ifdef DEBUG
#include <iostream>
#define LOG(msg) std::cout << "Debug: " << msg << std::endl
#else
#define LOG(msg) // Debugolás kikapcsolva
#endif
int main() {
LOG("Ez egy hibakereső üzenet.");
return 0;
}
🔹 Ha a #define DEBUG
ott van, akkor a LOG()
kiírja az üzenetet, különben nem csinál semmit.
#if
, #elif
, #else
#define VERZIO 2
#if VERZIO == 1
#define UZENET "Verzió 1 fut"
#elif VERZIO == 2
#define UZENET "Verzió 2 fut"
#else
#define UZENET "Ismeretlen verzió"
#endif
int main() {
std::cout << UZENET << std::endl;
return 0;
}
🔹 A #define VERZIO 2
miatt a "Verzió 2 fut"
üzenet fog megjelenni.
#pragma
DirektívákA #pragma
egy fordítóspecifikus utasítás, amely speciális beállításokat tesz lehetővé.
#pragma once
#pragma once
🔹 Biztosítja, hogy a fejlécfájl csak egyszer legyen beillesztve (hasonló a #ifndef
védőhöz).
#pragma GCC diagnostic
#pragma GCC diagnostic ignored "-Wunused-variable" // Figyelmeztetések kikapcsolása
🔹 Elnyom bizonyos fordítói figyelmeztetéseket.
include guard
)A fejlécfájlokat többször is be lehet illeszteni, ami problémát okozhat. Ennek megakadályozására használhatunk #ifndef
védelmet vagy #pragma once
-t.
#ifndef
fejlécfájl védelem#ifndef SAJATFAJL_H
#define SAJATFAJL_H
void fuggveny() {
std::cout << "Ez egy függvény" << std::endl;
}
#endif
🔹 Ez biztosítja, hogy a fájl csak egyszer legyen beillesztve.
Direktíva | Leírás |
---|---|
#include
|
Más fájlok beillesztése |
#define
|
Makrók létrehozása |
#ifdef / #ifndef
|
Feltételes fordítás makróval |
#if , #elif , #else
|
Feltételes fordítás értékkel |
#pragma once
|
Fejlécfájlok ismételt beillesztésének védelme |
#pragma GCC diagnostic
|
Speciális fordítói beállítások |
✅ Segít a kód újrafelhasználásában (#include
).
✅ Makrókkal és feltételes fordítással hatékonyabbá teszi a kódot (#define
, #if
).
✅ Biztosítja, hogy a fejlécfájlokat ne illesszük be többször (#pragma once
, #ifndef
).
✅ Elősegíti a hibakeresést és platformfüggetlenséget (#ifdef DEBUG
).