Na čo sa používa "stdafx.h" vo Visual Studiu?

Pri spustení projektu vo Visual Studiu 2010 sa automaticky vygeneruje súbor s názvom stdafx.h. Potrebujem vytvoriť multiplatformnú knižnicu C++, takže tento hlavičkový súbor nechcem/nemôžem použiť.

Na čo sa používa stdafx.h? Je v poriadku, že tento hlavičkový súbor jednoducho odstránim?

Riešenie

Všetky kompilátory jazyka C++ majú jeden vážny výkonnostný problém. Kompilácia kódu C++ je dlhý a pomalý proces.

Kompilácia hlavičiek, ktoré sú súčasťou súborov C++, je veľmi dlhý a pomalý proces. Kompilácia obrovských hlavičkových štruktúr, ktoré sú súčasťou API systému Windows a iných veľkých knižníc API, je veľmi, veľmi dlhý a pomalý proces. Musieť to robiť znova a znova a znova pre každý jeden zdrojový súbor Cpp je smrteľne ťažké.

Toto nie je jedinečný problém systému Windows, ale starý problém, s ktorým sa stretávajú všetky kompilátory, ktoré musia kompilovať proti veľkému API, ako je Windows.

Kompilátor Microsoft môže tento problém zmierniť jednoduchým trikom nazývaným prekompilované hlavičky. Tento trik je celkom šikovný: hoci každý súbor CPP môže potenciálne a legálne dať reťazcu hlavičkových súborov, ktoré sú zahrnuté nad každým súborom Cpp, trochu iný význam (napríklad tým, že pred zahrnutím súboru sú zahrnuté rôzne makrá #define'd alebo tým, že sú hlavičky zahrnuté v inom poradí), väčšinou to tak nie je. Väčšinou máme desiatky alebo stovky zahrnutých súborov, ale všetky majú mať rovnaký význam pre všetky súbory Cpp, ktoré sa kompilujú vo vašej aplikácii.

Kompilátor môže dosiahnuť obrovskú úsporu času, ak nemusí zakaždým začať kompilovať každý súbor Cpp plus jeho desiatky include doslova od začiatku.

Trik spočíva v tom, že ako počiatočný bod všetkých kompilačných reťazcov sa určí špeciálny hlavičkový súbor, takzvaný 'predkompilovaný hlavičkový súbor', ktorým je obyčajne súbor s názvom stdafx.h jednoducho z historických dôvodov.

Jednoducho si v súbore stdafx.h vypíšte všetky svoje veľké obrovské hlavičky pre API v príslušnom poradí a potom začnite každý svoj súbor CPP úplne na začiatku s príkazom #include "stdafx.h", pred akýmkoľvek zmysluplným obsahom (jediné, čo je pred ním povolené, sú komentáre).

Za týchto podmienok kompilátor namiesto toho, aby začal od nuly, začne kompilovať z už uložených výsledkov kompilácie všetkého, čo sa nachádza v súbore stdafx.h.

Neverím, že tento trik je jedinečný pre kompilátory Microsoftu, ani si nemyslím, že by to bol originálny vývoj.

V prípade kompilátorov Microsoft sa nastavenie, ktoré riadi používanie predkompilovaných hlavičiek, ovláda pomocou argumentu príkazového riadka pre kompilátor: /Yu "stdafx.h". Ako si viete predstaviť, použitie názvu súboru stdafx.h je jednoducho konvencia; ak si to želáte, môžete názov zmeniť.

V aplikácii Visual Studio 2010 sa toto nastavenie ovláda z grafického rozhrania kliknutím pravým tlačidlom myši na projekt CPP, výberom položky 'Properties' a prechodom na položku "Configuration Properties\C/C++\Precompiled Headers". V prípade iných verzií aplikácie Visual Studio bude umiestnenie v grafickom používateľskom rozhraní iné.

Všimnite si, že ak zakážete prekompilované hlavičky (alebo spustíte svoj projekt cez nástroj, ktorý ich nepodporuje), neznamená to, že váš program bude nelegálny; znamená to len to, že váš nástroj bude zakaždým kompilovať všetko od začiatku.

Ak vytvárate knižnicu bez závislostí od systému Windows, môžete jednoducho zakomentovať alebo odstrániť #includes zo súboru stdafx.h. Nie je potrebné odstraňovať súbor ako taký, ale zjavne to môžete urobiť aj tak, že vypnete vyššie uvedené nastavenie prekompilovania hlavičky.

Komentáre (16)

Je to "prekompilovaný hlavičkový súbor" -- všetky hlavičky, ktoré zahrniete do stdafx.h, sú predspracované, aby sa ušetril čas pri následných kompiláciách. Viac sa o tom dočítate tu na MSDN.

Ak'vytvárate multiplatformovú aplikáciu, pri vytváraní projektu zaškrtnite "Empty project" a Visual Studio do projektu nevloží vôbec žiadne súbory.

Komentáre (2)

Práve som na to narazil, pretože sa snažím vytvoriť si holý rámec, ale začal som vytvorením novej možnosti programu Win32 vo Visual Studio 2017. "stdafx.h" je zbytočný a mal by byť odstránený. Potom môžete odstrániť hlúpe súbory "stdafx.h" a "stdafx.cpp", ktoré sú v Prieskumníkovi riešení, ako aj súbory z vášho projektu. Na jeho'miesto budete musieť vložiť

#include 

namiesto toho.

Komentáre (0)