Файл с име stdafx.h
се генерира автоматично, когато стартирам проект във Visual Studio 2010. Трябва да направя междуплатформена C++ библиотека, така че не искам/не мога да използвам този заглавен файл.
За какво се използва stdafx.h
? Добре ли е просто да премахна този заглавен файл?
Всички компилатори на C++ се сблъскват с един сериозен проблем, свързан с производителността. Компилирането на код на C++ е дълъг и бавен процес.
Компилирането на хедъри, включени в горната част на C++ файловете, е много дълъг и бавен процес. Компилирането на огромните заглавни структури, които са част от Windows API и други големи библиотеки с API, е много, много дълъг и бавен процес. Да се налага да го правите отново, отново и отново за всеки отделен файл с източник Cpp е смъртоносно.
Това не е уникален проблем за Windows, а стар проблем, с който се сблъскват всички компилатори, които трябва да компилират срещу голям API като Windows.
Компилаторът на Microsoft може да облекчи този проблем с един прост трик, наречен прекомпилирани заглавия. Трикът е доста хитър: въпреки че всеки CPP файл може потенциално и законно да придаде малко по-различно значение на веригата от заглавни файлове, включени на върха на всеки Cpp файл (чрез неща като различни макроси #define'd преди включването или чрез включване на заглавните файлове в различен ред), това най-често не е така. В повечето случаи имаме десетки или стотици включени файлове, но всички те са предназначени да имат едно и също значение за всички Cpp файлове, които се компилират във вашето приложение.
Компилаторът може да направи огромна икономия на време, ако не се налага всеки път да започва да компилира всеки Cpp файл плюс десетките му включени файлове буквално отначало.
Трикът се състои в определянето на специален заглавен файл като начална точка на всички вериги за компилиране, т.нар. 'прекомпилиран заглавен файл', който обикновено е файл с име stdafx.h просто по исторически причини.
Просто избройте всички големи заглавия за вашите API във файла stdafx.h в съответния ред и след това започнете всеки от вашите CPP файлове в самия му връх с #include "stdafx.h"
, преди каквото и да е смислено съдържание (единственото позволено нещо преди това са коментарите).
При тези условия, вместо да започне от нулата, компилаторът започва да компилира от вече записаните резултати от компилирането на всичко в stdafx.h
.
Не вярвам този трик да е уникален за компилаторите на Microsoft, нито пък мисля, че е оригинална разработка.
При компилаторите на Microsoft настройката, която контролира използването на предварително компилирани заглавия, се управлява от аргумент от командния ред към компилатора: /Yu "stdafx.h"
. Както можете да си представите, използването на името на файла stdafx.h
е просто конвенция; можете да промените името, ако желаете.
Във Visual Studio 2010 тази настройка се контролира от графичния потребителски интерфейс чрез щракване с десния бутон на мишката върху CPP проекта, избор на 'Properties' и преминаване към "Configuration Properties\C/C++\Precompiled Headers". За други версии на Visual Studio местоположението в графичния потребителски интерфейс ще бъде различно.
Обърнете внимание, че ако забраните предварително компилираните заглавия (или стартирате проекта си чрез инструмент, който не ги поддържа), това не прави програмата ви незаконна; това просто означава, че инструментът ви ще компилира всичко от нулата всеки път.
Ако създавате библиотека без зависимости от Windows, можете лесно да коментирате или да премахнете #includes от файла stdafx.h. Не е необходимо да премахвате файла сам по себе си, но очевидно можете да го направите и като деактивирате горната настройка на заглавието за предварително компилиране.
Това е "предварително компилиран заглавен файл" -- всички заглавия, които включвате в stdafx.h, се обработват предварително, за да се спести време при последващи компилации. Можете да прочетете повече за това тук в MSDN.
Ако'изграждате междуплатформено приложение, поставете отметка "Empty project" при създаването на проекта и Visual Studio няма'да постави никакви файлове в проекта ви.
Току-що се сблъсках с това, тъй като се опитвам да си създам рамка с голи кости, но започнах със създаването на нова опция за програма Win32 във Visual Studio 2017. "stdafx.h" е ненужен и трябва да бъде премахнат. След това можете да премахнете глупавите "stdafx.h" и "stdafx.cpp", които се намират в Solution Explorer, както и файловете от вашия проект. На негово място ще трябва да поставите
#include <Windows.h>
вместо това.