2009-05-24 7 views
28

Schnelle Frage - Warum vorkompilierte Header verwenden?Warum vorkompilierte Header (C/C++) verwenden?

EDIT: antwortet Lesen, vermute ich, was ich habe mit ihnen zu tun ein bisschen dumm ist:

#pragma once 

//Defines used for production versions 

#ifndef PRODUCTION 
#define eMsg(x) (x) //Show error messages 
#define eAsciiMsg(x) (x) 
#else 
#define eMsg(x) (L"") //Don't show error messages 
#define eAsciiMsg(x) ("") 
#endif //PRODUCTION 

#include "targetver.h" 
#include "version.h" 

//Enable "unsafe" but much faster string functions 
#define _CRT_SECURE_NO_WARNINGS 
#define _SCL_SECURE_NO_WARNINGS 

//Standard Includes 
#include <stdio.h> 
#include <tchar.h> 
#include <iostream> 
#include <direct.h> 
#include <cstring> 
#ifdef _DEBUG 
#include <cstdlib> 
#endif 

//Standard Template Library 
#include <bitset> 
#include <vector> 
#include <list> 
#include <algorithm> 
#include <iterator> 
#include <string> 
#include <numeric> 

//BOOST libraries 
#include <boost/algorithm/string.hpp> 
#include <boost/lexical_cast.hpp> 
#include <boost/scoped_array.hpp> 

//Windows Includes 
#define WIN32_LEAN_AND_MEAN 
#include <windows.h> 
#include "FILETIME_Comparisons.h" 
#include <shlwapi.h> 
#include <Shellapi.h> 
#include <psapi.h> 
#include <imagehlp.h> 
#include <mscat.h> 
#include <Softpub.h> 
#include <sfc.h> 
#pragma comment(lib, "wintrust.lib") 
#pragma comment(lib,"kernel32.lib") 
#pragma comment(lib,"Psapi.lib") 
#pragma comment(lib,"shlwapi.lib") 
#pragma comment(lib,"imagehlp.lib") 
#pragma comment(lib,"Advapi32.lib") 
#pragma comment(lib,"Shell32.lib") 
#pragma comment(lib,"Sfc.lib") 
#pragma comment(lib,"Version.lib") 

//Crypto ++ Libraries 
#ifdef _DEBUG 
#pragma comment(lib,"cryptlibd.lib") 
#else 
#pragma comment(lib,"cryptlib.lib") 
#endif 
#define CRYPTOPP_ENABLE_NAMESPACE_WEAK 1 
#include <md5.h> 
#include <sha.h> 

//String libraries 
#include "stringUnicodeConversions.h" 
#include "expandEnvStrings.h" 
#include "randomString.h" 
#include "getShortPathName.h" 

//Regular Expression Libraries 
#include "fpattern.h" 

//File Result Record 
#include "unixTimeToFileTime.h" 
#include "fileData.h" 

//Writer 
#include "writeFileData.h" 

//Criteria Structure System 
#include "priorities.h" 
#include "criterion.H" 
#include "OPSTRUCT.H" 
#include "regexClass.H" 
#include "FILTER.h" 

//Sub Programs Root Class 
#include "subProgramClass.h" 

//Global data 
#include "globalOptions.h" 

//Logger 
#include "logger.h" 

//Console parser 
#include "consoleParser.h" 

//Timeout handler 
#include "timeoutThread.h" 

//Zip library 
#include "zip.h" 
#include "unzip.h" 
#include "zipIt.h" 

//Scanner 
#include "mainScanner.h" 
#include "filesScanner.h" 

//Sub Programs 
#include "volumeEnumerate.h" 
#include "clsidCompressor.h" 
#include "times.h" 
#include "exec.h" 
#include "uZip.h" 

//64 Bit support 
#include "disable64.h" 
+3

Eine wichtige Anmerkung zu Visual Studio: Stellen Sie sicher, dass #include "stdafx.h" das erste # include in jeder Kopfzeile ist, oder Ihre Dateien werden nicht analysiert! Dumm, ich weiß. Aber es ist ein leichter Fehler zu machen. – rlbond

+2

Genauer gesagt, alles ÜBER # include "stdafx.h" wird nicht geparst. Siehe http://en.wikipedia.org/wiki/Precompiled_header – rlbond

Antwort

34

Es kompiliert eine Menge schneller. C++ Compilation dauert Jahre ohne sie. Versuchen Sie mal in einem großen Projekt zu vergleichen!

5

So haben Sie sie nicht jedes Mal kompilieren Sie Ihr Projekt erstellen. Sie werden für Systemkopfzeilen verwendet, die sich nicht ändern.

+0

Also (lesen Sie edit oben) was Sie sagen ist, dass ich ziemlich dumm gewesen bin ... –

5

Es beschleunigt die Kompilierung.

Wenn Sie Header aus anderen Projekten einfügen, erwarten Sie nicht, sie zu ändern. Wenn Sie diese in einen vorkompilierten Header einfügen, muss dieser Code nicht erneut kompiliert werden, wenn Sie Änderungen an Ihrem Quellcode vornehmen. Dies reduziert die wiederholte Erstellung von unveränderten Code und beschleunigt die Kompilierzeit.

25

In C/C++ ist der # include-Mechanismus eine textuelle Kopie der Datei in der aktuellen Datei angegeben. Header enthalten andere Header (die noch andere Header enthalten). Wenn Sie also #include ausführen, könnte es in jede cpp-Datei (oder cxx, c, was auch immer) mehrere zehntausend C++ - Zeilen einfügen, die alle sein müssen jedes Mal kompiliert. Dies kann bei großen Projekten ein großer Engpass sein.

vorkompilierte Header dies beschleunigen, indem jeder Header einmal kompilieren, dann einschließlich der Zustand in den CPP kompiliert sie in enthalten sind

+0

Ich habe mir einen Einblick in was eigentlich vorkompiliert Header ist Ursache, wie wir wissen, Header-Dateien sind keine Übersetzungseinheit für sich. Schöne Erklärung, danke. – macroland

9

Re:. Ihre aktuelle Nutzung, wenn Sie ein Ziel mit einer sehr großen Anzahl von Dateien Es kann jedoch immer noch schneller sein, PCH auf diese Weise zu benutzen - versuchen Sie es auszuschalten, um es herauszufinden. Es hängt davon ab: Wenn Sie viele eigene Header haben und diese nur selten ändern und Sie eine sehr große Anzahl von Quelldateien haben, die Sie viel häufiger ändern, wird Ihre PCH-Nutzung die Rebuild-Zeiten verkürzen.

Aber normale Ratschläge sind, nur Dinge in PCH zu legen, die sich nie ändern, weil es einen gewissen Mehraufwand für die Herstellung des PCH selbst gibt. Wenn Sie das bei jeder Neuerstellung auslösen (indem Sie einen Ihrer Header ständig optimieren), kann die Neuerstellung mit PCH langsamer vonstatten gehen.

+0

Diese Dateien ändern ziemlich jeden Build: P –