Waar wordt "stdafx.h" voor gebruikt in Visual Studio?

Een bestand met de naam stdafx.h wordt automatisch gegenereerd wanneer ik een project start in Visual Studio 2010. Ik moet een cross-platform C++ bibliotheek maken, dus ik wil/kan dit header bestand niet gebruiken.

Waar wordt stdafx.h voor gebruikt? Is het OK dat ik dit header bestand gewoon verwijder?

Oplossing

Alle C++ compilers hebben te maken met één ernstig prestatieprobleem. Het compileren van C++ code is een lang, traag proces.

Het compileren van headers die bovenop C++ bestanden staan is een zeer lang, traag proces. Het compileren van de enorme header structuren die deel uitmaken van Windows API en andere grote API bibliotheken is een zeer, zeer lang, traag proces. Om het steeds opnieuw te moeten doen voor elk Cpp bronbestand is de doodsteek.

Dit is niet uniek voor Windows, maar een oud probleem voor alle compilers die moeten compileren tegen een grote API zoals Windows.

De Microsoft compiler kan dit probleem verhelpen met een eenvoudige truc genaamd precompiled headers. De truc is vrij handig: hoewel elk CPP-bestand potentieel en wettelijk een iets andere betekenis kan geven aan de keten van header-bestanden die boven op elk Cpp-bestand staan (door dingen als verschillende macro's #define'd voor de includes, of door de headers in verschillende volgorde op te nemen), is dat meestal niet het geval. Meestal hebben we tientallen of honderden ingesloten bestanden, maar ze zijn allemaal bedoeld om dezelfde betekenis te hebben voor alle Cpp bestanden die in je applicatie worden gecompileerd.

De compiler kan enorme tijdwinst boeken als hij niet elke keer letterlijk vanaf nul moet beginnen met het compileren van elk Cpp-bestand plus zijn tientallen includes.

De truc bestaat erin een speciaal header-bestand aan te wijzen als startpunt van alle compilatieketens, het zogenaamde 'precompiled header' bestand, dat gewoonlijk een bestand is met de naam stdafx.h, gewoon om historische redenen.

Maak gewoon een lijst van al je grote headers voor je API's in je stdafx.h bestand, in de juiste volgorde, en begin dan elk van je CPP bestanden helemaal bovenaan met een #include "stdafx.h", vóór enige zinvolle inhoud (zowat het enige dat ervoor is toegestaan is commentaar).

Onder die omstandigheden, in plaats van van nul af aan te beginnen, begint de compiler te compileren vanaf de reeds opgeslagen resultaten van het compileren van alles in stdafx.h.

Ik geloof niet dat deze truc uniek is voor Microsoft compilers, en ik denk ook niet dat het een originele ontwikkeling was.

Voor Microsoft compilers wordt de instelling die het gebruik van voorgecompileerde headers regelt, geregeld door een command line argument naar de compiler: /Yu "stdafx.h". Zoals u zich kunt voorstellen, is het gebruik van de stdafx.h bestandsnaam slechts een conventie; u kunt de naam wijzigen als u dat wenst.

In Visual Studio 2010 wordt deze instelling vanuit de GUI geregeld door met de rechter muisknop op een CPP Project te klikken, 'Eigenschappen' te selecteren en te navigeren naar "Configuratie-eigenschappen:`C/C++Voorgecompileerde headers". Voor andere versies van Visual Studio zal de locatie in de GUI anders zijn.

Merk op dat als je voorgecompileerde headers uitschakelt (of je project door een tool laat lopen die'ze niet ondersteunt), het je programma niet illegaal maakt; het betekent alleen dat je tool elke keer alles vanaf nul zal compileren.

Als u een bibliotheek maakt zonder Windows afhankelijkheden, kunt u gemakkelijk #includes weglaten of verwijderen uit het stdafx.h bestand. Het is niet nodig om het bestand per se te verwijderen, maar het is duidelijk dat u dat ook kunt doen, door de precompile header instelling hierboven uit te schakelen.

Commentaren (16)

Het'is een "voorgecompileerd header bestand" -- alle headers die u in stdafx.h opneemt worden voorverwerkt om tijd te besparen tijdens latere compilaties. U kunt er meer over lezen hier op MSDN.

Als u'een cross-platform toepassing bouwt, vink dan "Empty project" aan bij het maken van uw project en Visual Studio zal helemaal geen bestanden in uw project plaatsen.

Commentaren (2)

Ik ben hier net zelf tegenaan gelopen aangezien ik'zelf een bare bones framework probeer te maken maar ben begonnen met het aanmaken van een nieuwe Win32 Program optie in Visual Studio 2017. "stdafx.h" is overbodig en moet verwijderd worden. Vervolgens kun je de stomme "stdafx.h" en "stdafx.cpp" die in je Solution Explorer staat verwijderen, evenals de bestanden uit je project. In plaats daarvan moet je

#include 

zetten.

Commentaren (0)