Ugrás a tartalomhoz

header file

A Wikiszótárból, a nyitott szótárból


Főnév

header file (tsz. header files)

  1. (informatika) A header fájlok (magyarul fejlécfájlok) a C++ programozásban használt fájlok, amelyek deklarációkat és makrókat tartalmaznak. Ezek segítségével a kód modulárisabbá, átláthatóbbá és újrahasználhatóbbá válik.

1. Mi az a header fájl?

A header fájl egy olyan fájl, amely általában .h vagy .hpp kiterjesztéssel rendelkezik, és amelyben osztályok, függvények, konstansok és makrók deklarációi találhatók. A header fájlokat az #include direktíva segítségével csatoljuk a programunkhoz.

Példa egy egyszerű header fájlra (myheader.h):

#ifndef MYHEADER_H
#define MYHEADER_H

void hello(); // Függvény deklaráció

#endif // MYHEADER_H

És a hozzá tartozó forrásfájl (myheader.cpp):

#include <iostream>
#include "myheader.h"

void hello() {
    std::cout << "Helló, világ!" << std::endl;
}

Használata a main.cpp fájlban:

#include "myheader.h"

int main() {
    hello();
    return 0;
}

2. Miért használunk header fájlokat?

  • Modularitás: A kód kisebb, kezelhetőbb részekre bontható.
  • Újrahasználhatóság: Ugyanaz a deklaráció több fájlban is használható.
  • Kód elválasztása: Az implementációt és a deklarációt külön fájlba helyezhetjük.



3. A header fájlok tartalma

Egy tipikus header fájl az alábbiakat tartalmazhatja:

3.1. Makrók és konstansok

#ifndef PI
#define PI 3.14159
#endif

3.2. Függvénydeklarációk

void printMessage();
int add(int a, int b);

3.3. Osztályok deklarációja

class MyClass {
public:
    void show();
};

3.4. Névtér (namespace) használata

namespace MyNamespace {
    void doSomething();
}

4. Header fájlok beillesztése

A #include direktíva segítségével tudjuk csatolni a header fájlokat:

4.1. Standard könyvtári header fájlok

#include <iostream>  // Beépített fájl, ezért <> jelek között van

4.2. Saját header fájlok

#include "myheader.h"  // Saját fájl, ezért idézőjelek között van

A különbség: - A < > jelekkel körülvett fájlokat a fordító a rendszerkönyvtárakban keresi. - Az ” ” (idézőjelek) közötti fájlokat először az aktuális projekt könyvtárában keresi a fordító.



5. Header fájlok védelme az ismételt beillesztés ellen

A header fájlokat többször is beilleszthetjük egy programba, ami dupla deklarációt és fordítási hibát eredményezhet. Ennek megelőzésére használjunk header guardokat vagy #pragma once-ot.

5.1. Header guard használata

#ifndef MYHEADER_H
#define MYHEADER_H

void hello();

#endif // MYHEADER_H

5.2. #pragma once használata

#pragma once

void hello();

A #pragma once modern alternatívája a header guardoknak, és megakadályozza, hogy egy fájlt többször beolvassanak.



6. Osztályok implementálása header fájlban

A header fájlban általában csak az osztályok deklarációja található, míg az implementációt egy külön forrásfájlba tesszük. Példa:

6.1. Header fájl – myclass.h

#ifndef MYCLASS_H
#define MYCLASS_H

class MyClass {
public:
    void show();
};

#endif // MYCLASS_H

6.2. Implementáció – myclass.cpp

#include <iostream>
#include "myclass.h"

void MyClass::show() {
    std::cout << "Üdv a C++ világában!" << std::endl;
}

6.3. Használat – main.cpp

#include "myclass.h"

int main() {
    MyClass obj;
    obj.show();
    return 0;
}

7. Inline függvények a header fájlban

Ha egy függvény nagyon rövid, akkor a header fájlban is implementálhatjuk az inline kulcsszóval:

#ifndef MATHUTILS_H
#define MATHUTILS_H

inline int square(int x) {
    return x * x;
}

#endif // MATHUTILS_H

Az inline függvények nem okoznak duplikált definíciót, mert a fordító minden használatnál behelyettesíti a függvény kódját.



8. Template osztályok a header fájlban

A template-eket szintén header fájlban kell implementálni, mivel a fordító a sablonokat az adott használati helyen generálja.

#ifndef TEMPLATE_H
#define TEMPLATE_H

template <typename T>
class Box {
    T value;
public:
    Box(T v) : value(v) {}
    T getValue() { return value; }
};

#endif // TEMPLATE_H

Használata:

#include <iostream>
#include "template.h"

int main() {
    Box<int> intBox(5);
    std::cout << intBox.getValue() << std::endl;
    return 0;
}

9. Header fájlok és az #include sorrendje

Ajánlott először a standard könyvtárakat, majd a saját fájlokat beilleszteni:

#include <iostream>
#include <vector>
#include "myheader.h"
#include "mathutils.h"

Ez segít minimalizálni a függőségi problémákat és a fordítási időt.



10. Rossz gyakorlatok a header fájlokkal kapcsolatban

  • Felesleges függvényimplementáció header fájlban (kivéve inline vagy template esetén).
  • Nincs header guard vagy #pragma once, ami duplikált deklarációhoz vezethet.
  • Túl sok globális változó a header fájlban, ami ütközést okozhat.



Összegzés

A header fájlok a C++ programok elengedhetetlen részei, és segítenek a kód strukturálásában és újrahasználhatóságában. Az alábbi alapelveket érdemes követni: 1. Használj header guardot vagy #pragma once. 2. Deklarációkat és definíciókat különítsd el. 3. Szükségtelen függőségeket kerüld. 4. Moduláris és tiszta kódot írj.