Plik nagłówkowy

Pliki nagłówkowe – przy kompilatorze języka C i pochodnych (C++ itp.) pliki źródłowe o rozszerzeniu „h” (w C++ powinno się dla odróżnienia stosować „hpp”, ale w praktyce najczęściej spotykane jest nadal rozszerzenie „h”) zawierające opis interfejsu modułu: deklaracje zmiennych, funkcji, klas i innych struktur danych. Używa się ich ze względu na to, by nie było potrzeby, przy każdej nawet najmniejszej zmianie w implementacji jednego modułu, rekompilowania wszystkich innych odwołujących się do niego. W nowszych językach, takich jak Java czy C#, nie ma już potrzeby stosowania plików nagłówkowych.

Po wydaniu preprocesorowi poleceń dołączenia plików nagłówkowych np.:

#include "NazwaPliku.hpp"
#include <cstdio>

przed rozpoczęciem kompilacji tekst tych plików jest wstawiany do tekstu programu w miejsce instrukcji #include. Pierwsza jej postać służy do dołączenia pliku nagłówkowego znajdującego się w tym samym katalogu co program. Nazwa modułu umieszczona w ostrych nawiasach oznacza, że znajduje się on w katalogu ze standardowymi plikami nagłówkowymi (dostarczonymi wraz z kompilatorem).

Pliki nagłówkowe powinny zawierać

Definicje funkcji (metod) powinno umieszczać się w pliku o tej samej nazwie, co plik nagłówkowy, lecz z rozszerzeniem „c” lub „cpp”.

Przykład użycia

Plik rnm.hpp zawiera:

#ifndef _RNM_HPP

#define _RNM_HPP
float Suma(float,float);
float Roznica(float,float);

#endif

Plik rnm.cpp:

float Suma(float x,float y)
{
     return (x+y);
}
float Roznica(float x,float y)
{
     return (x-y);
}

Plik główny programu:

#include "rnm.hpp"
#include <iostream>

using namespace std;

int main()
{
    float a,b;
    
    cin>>a;
    cin>>b;
    
    cout<<a<<" + "<<b<<" = "<<Suma(a,b)<<endl;
    cout<<a<<" - "<<b<<" = "<<Roznica(a,b)<<endl;
    return 0;
}

Poniższe dyrektywy zapobiegają próbie dołączenie tego samego pliku więcej niż jeden raz:

#ifndef _RNM_HPP
#define _RNM_HPP
    ...
#endif

preprocesor sprawdza, czy została już zdefiniowania etykieta _RNM_HPP, jeżeli nie, to zostaje ona zainicjowana i treść całego modułu jest dołączana do programu – przy następnej próbie dołączenia tego pliku preprocesor będzie znał etykietę _RNM_HPP, więc ominie (nie dołączy) instrukcje pomiędzy #ifndef _RNM_HPP a #endif.

W przypadku niektórych kompilatorów C++ (np. Microsoft Visual C++) instrukcja #pragma once może być użyta do zapobiegania wielokrotnego dołączania pliku – nie wchodzi ona jednak w skład ISO C++ i jest odradzana.

Niektóre pliki nagłówkowe, głównie dotyczące modułów standardowych, są bezpośrednio dostarczone z kompilatorem i umożliwiają łatwe posługiwanie się podstawowymi funkcjami takimi jak obsługa urządzeń wejścia/wyjścia czy bardziej zaawansowane funkcje matematycznne.

Pliki nagłówkowe z C używane w programach C++

Zgodnie z ISO C++, standardowe pliki nagłówkowe o rozszerzeniu „h”, w programach napisanych w C++, mogą być dołączane na dwa możliwe sposoby:

#include <cNAZWAPLIKU>
#include "cNAZWAPLIKU"

gdzie NAZWAPLIKU jest nazwą bez rozszerzenia – przykładowo, podczas gdy w C używa się #include <stdio.h>, w C++ należy użyć zapisu #include <cstdio>.