#pragma hdrstop to dyrektywa specyficzna dla kompilatora, która wskazuje, gdzie kończy się część nagłówkowa kodu, która ma być prekompilowana. Jej głównym celem jest
przyspieszenie kompilacji, zwłaszcza w projektach wieloplikowych, gdzie wiele plików źródłowych może zawierać te same nagłówki.
###
Dlaczego działa? Przy użyciu
#pragma hdrstop
, kompilator:
- Przetwarza wszystkie nagłówki przed tą dyrektywą jako
precompiled header.
- Ignoruje nagłówki po niej, co unika ponownego przetwarzania tych samych plików w każdym pliku źródłowym.
###
Gdzie wstawiać? Najlepszym miejscem jest
pierwsza część nagłówków wspólnych dla całego projektu. Przykład:
#include <windows.h>
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Logger.h"
Nagłówki przed
#pragma hdrstop
powinny być identyczne we wszystkich plikach źródłowych. W przeciwnym razie kompilator nie będzie mógł skorzystać z prekompilacji.
###
Efekty uboczne i błędy - **Zła lokalizacja**: Jeśli dyrektywa jest wstawiona po nagłówkach specyficznych dla danego pliku, kompilator nie będzie mógł prekompilować tych nagłówków, co może spowolnić kompilację.
- **Często modyfikowane nagłówki**: Jeśli nagłówki przed
#pragma hdrstop
są często zmieniane, prekompilacja zostanie ponownie generowana, co może
niwelować korzyści.
- **Błędy linkowania**: Występują rzadko, ale mogą się pojawić, jeśli nagłówki po
#pragma hdrstop
są niezgodne z definicjami w innych plikach.
###
Dobry praktyki - Umieszczaj
#pragma hdrstop
przed nagłówkami wspólnymi (np.
<windows.h>
).
- Po niej dołączaj nagłówki specyficzne dla danego pliku.
- Unikaj jej użycia w nagłówkach, które często zmieniają się (np. w projekcie z intensywnym użyciem szablonów).
###
Praktyczny przykład W Borlandzie C++ Builder:
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {}
Takie rozmieszczenie zapewnia, że
<vcl.h>
jest prekompilowany, a
"Unit1.h"
przetwarzany osobno.
###
Szablony i optymalizacja Szablony (np.
std::vector<int>
) są rozszerzane w czasie kompilacji. Jeśli są umieszczone po
#pragma hdrstop
, nie skorzystają z prekompilacji. Dlatego warto je dołączać przed tą dyrektywą, jeśli są wspólnymi elementami projektu.
###
Podsumowanie -
#pragma hdrstop
działa, ale wymaga
starannego planowania struktury projektu.
- W praktyce przyspiesza kompilację o
2–3%, jak stwierdził "UserX".
- Najlepsze wyniki daje w projektach z dużą liczbą wspólnych nagłówków i małą liczbą zmian w tych nagłówkach.
Warto eksperymentować z lokalizacją tej dyrektywy i obserwować czas kompilacji, aby zoptymalizować pod kątem danego projektu.