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 typów (klas)
- deklaracje globalnych i statycznych zmiennych
- definicje stałych
- deklaracje funkcji (metod)
- definicje funkcji inline.
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>
.