#include to jest Copy-Paste

Dzisiaj o rzeczy, która początkującym (a nawet i średnio zaawansowanym) programistom C/C++ zdaje się czasem umykać - jak działa dyrektywa #include w języku C++. Cytując z MSDN:
The #include directive tells the preprocessor to treat the contents of a specified file as if those contents had appeared in the source program at the point where the directive appears.
Tak. #include to jest copy-paste. Ta dyrektywa nie robi nic innego, tylko zwyczajnie wkleja podany plik w miejsce siebie samej. Nie ma w tym żadnej dodatkowej magii - kompilator będzie widział dołączony plik dokładnie tak, jakby programista ręcznie wpisał jego zawartość w miejscu dyrektywy #include. Z tego faktu wypływa kilka istotnych wniosków:
  1. Pliki nagłówkowe nie są niczym specjalnym. Nie muszą mieć rozszerzenia .h/.hpp, mogą mieć rozszerzenie .kolorowe-kredki - nikomu to nie robi różnicy, ponieważ pliki nagłówkowe nie są kompilowane.
  2. Użycie #include nie ogranicza się do "dołączania plików nagłówkowych". Ponieważ jest to tylko i wyłącznie kopiuj-wklej zawartość podanego pliku, można napisać na przykład coś takiego:
    float dane[] = {
    #include "dane.txt"
    };
    W praktyce, taka konstrukcja jest nawet dość mądra - dane, zwłaszcza generowane automatycznie, lepiej trzymać na zewnątrz niż bezpośrednio w kodzie.
  3. O plikach nagłówkowych należy myśleć jak o kopiowaniu-wklejaniu kodu. Przyjęcie takiego punktu widzenia pozwala łatwo zrozumieć i wyczuć, dlaczego stosujemy deklaracje #ifndef/#endif oraz dlaczego nie umieszczamy w nagłówkach kodu funkcji innych niż inline.
Jak widać, w #include nie ma żadnej magii. Trzeba tylko na tę dyrektywę patrzeć we właściwy sposób. Preprocesor C/C++ jest bardzo prostym narzędziem. A #include jest bardzo prostym copy-paste'm.