#12Cand ai un proiect cu dependinte mari (gen Ogre3D), exista o metoda numita "precompiled headers" care poate salva chiar si o ora-doua pe zi din timpul de compilare. (adica timpi morti)
(depinde de cat de des dai build desigur)
Cand creezi un proiect nou Win32/CLR in MSVC, de obicei iti creaza pt tine un precompiled header. (exista doar 1/proiect)
Tehnic, ce face acest precompiled header este ca trece compilatorul prin acel .h/.cpp (default in MSVC: stdafx.h/.cpp), si
salveaza parse tree-ul, astfel incat atunci cand in vre-un alt .cpp scrii
#include "stdafx.h", nu mai compileaza toate header-ele incluse de stdafx.h pt
fiecare .cpp din proiectul tau, ci doar incepe cu parse tree-ul deja salvat, si compileaza doar codul scris de tine.
Am avut proiecte care durau 10-20 minute sa se compileze, si cu precompiled headers dura cam juma' de minut.

Anyway, se folosesc cam asa ceva:
stdafx.h:
Cod sursă:
#pragma once
#include Ogre.h
#include whatever_external_lib.h
#include windows.h
stdafx.cpp:
Cod sursă:
#include "stdafx.h"
Exista insa cateva gotcha'-uri:
* Un precompiled header compilat drept C++ nu merge folosit in C, si unul C nu merge in C++. De obicei asta nu e problema, dar, mai stii...
Rezolvare: spre ex, daca proiectul are o adunatura de .cpp-uri, si cateva .c-uri, atunci in Solution Explorer, click-dreapta pe respectivele .c-uri, Properties->C/C++->Precompiled Headers, si in optiunea "Create/Use Precompiled Headers" selectezi "Not Using Precompiled Headers". Fisierul sursa nu trebuie schimbat deloc.
stdafx.c -> C precompiled header
stdafx.cpp -> C++ precompiled header
(doar dai rename in Solution Explorer si ti la schimbat intre C/C++. Nu uita sa-l recompilezi)
Daca un fisier nu foloseste Precompiled Headers, tot poti (si e normal) sa incluzi stdafx.h, doar ca o sa compileze ca normal, adica incet.
* Daca fisierul sursa .c/.cpp foloseste precompiled headers (on by default in MSVC), atunci primul lucru care trebuie sa apara (in afara de comment-uri) este
#include "stdafx.h". Asta deoarece orice apare deasupra acelui #include este ignorat de compilator. (deci daca nu-l incluzi deloc, nu compileaza nimic, si te cearta compilatorul)
* Cel putin in versiunea 8/2005, daca modifici stdafx.h, stdafx.cpp nu se compileaza automat cand dai CTRL+F7. ("compile file")
Rezolvare: deschizi stdafx.cpp si apesi CTRL+F7 sa-l compilezi singur, dupaia compilez orice alt fisier vrei.
Si in sfarsit:
* Papa mult RAM :-P (adica mai mult decat crede MSVC, ca mult nu e)
La mine, cu Ogre si alte balarii incluse, se duce aproape de 60MB RAM. (atat o sa iti ia si de pe HDD), si da eroare, zice si cum se rezolva.
Rezolvare: Click-dreapta pe proiect in Solution Explorer -> Properties -> C/C++ -> Command Line, si in casuta de jos pui flag-ul care ti-l zice compilatorul in eroare. De ex, mie mi-a cerut sa pun
-Zm115. Asta inseamna ca o sa pape 57.5MB (jumate din valoare) atunci cand compileaza.
Ah, si mai e ceva...
stdafx.h se include la inceputul fiecarui .c/.cpp, dar
nu se include in headere.
In concluzie, Precompiled Headers nu prea iti sporesc timpii pt headere C/COM (ex windows.h sau d3d), insa pt librarii 'mamut' gen Ogre, PhysX etc. fac des diferenta de la cer la pamant. Si nici nu e nici pe departe atata bataie de cap pe cat pare ca am scris

PS: cum adaugi precompiled headers la un proiect daca ai deselectat optiunea in wizard-ul de proiect nou din MSVC:
1) creezi 2 fisiere: stdafx.h si stdafx.cpp (defapt poti sa le zici cum ai tu chef)
2) click-dreapta pe proiect in Solution Explorer -> Properties -> C/C++ -> Precompiled Headers -> Use Precompiled Headers la prima optiune.
3) click-dreapta pe stdafx.cpp (sau cum i-ai zis) -> Properties -> C/C++ -> Precompiled Headers ->
Create Precompiled Headers la prima optiune, si apoi compilezi acel fisier.
4) pt fiecare .c/.cpp din proiect, ai grija sa ai
#include "stdafx.h" la inceputul lor.
5) verifica daca zice "Use Precompiled Headers" in Properties -> C/C++ -> Precompiled Headers pt fisierele tale .c/.cpp. Posibil sa nu se schimbe automat, daca nu... click click click.

(poti selecta mai multe .c/.cpp uri in acelasi timp in Solution Explorer, si le poti edita optiunile comune la Properties)
/LE: normal, precompiled headers merg si cu GCC, insa nu stiu cum. Parca trebuie sa adaugi stdafx.h in makefile ca si cum ar fi un .cpp obisnuit, si sa setezi dependintele .cpp-urilor sa il includa si pe ala. Google or something.