Plik nagłówkowy
Z Wikipedii
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>.