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 po to, by nie trzeba było przy każdej najmniejszej zmianie w implementacji jednego modułu rekompilować 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 polecenia dołączenia pliku:
#include "NazwaPliku.hpp" #include <cstdio>
przed rozpoczęciem kompilacji tekst plików nagłówkowych jest dołączany do tekstu programu w miejsce instrukcji #include.
Pierwsza wersja służy do dołączenia pliku znajdującego się w tym samym katalogu co program. Nazwa modułu w ostrych nawiasach oznacza, że znajduje się on w katalogu ze standardowymi plikami nagłówkowymi (dostarczonymi z kompilatorem).
Pliki nagłówkowe powinny zawierać:
- deklaracje typów (klas)
- deklaracje globalnych i statycznych zmiennych
- definicje stałych
- deklaracje funkcji
- definicje funkcji inline
Definicje funkcji powinno umieszczać się w pliku o tej samej nazwie, co nagłówkowy, z rozszerzeniem "c"/"cpp".
Przykład użycia pliku nagłówkowego (w pierwszej linii podana jest nazwa pliku):
// rnm.hpp #ifndef _rnm_hpp_ #define _rnm_hpp_ float Suma(float x,float y); float Roznica(float x,float y); #endif
// rnm.cpp
float Suma(float x,float y)
{
return (x+y);
}
float Roznica(float x,float y)
{
return (x-y);
}
#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 1;
}
Dyrektywy:
#ifndef _rnm_hpp_
#define _rnm_hpp_
...
#endif
zapobiegają próbie dołączenie tego samego pliku więcej niż jeden raz - kompilator sprawdza, czy została zdefiniowania etykieta (w tym przypadku "_rnm_hpp_"), jeżeli nie - zostaje ona zainicjowana, a treść modułu jest dołączana do programu - przy następnej próbie dołączenia tego pliku kompilator będzie już znał etykietę "_rnm_hpp_", ominie więc (nie dołączy) instrukcje mię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 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 zaawansowanych funkcji matematycznych.
Pliki nagłówkowe z C używane w programach C++
Zgodnie z ISO C++ pliki nagłówkowe o rozszerzeniu "c" w programach napisanych w C++ powinny być dołączane w następujący sposób:
#include <cNAZWAPLIKU> #include "cNAZWAPLIKU"
gdzie NAZWAPLIKU jest nazwą bez rozszerzenia. Przykładowo, podczas gdy w C pisze się #include <stdio.h>, w C++ należy użyć zapisu #include <cstdio>.